[Scummvm-cvs-logs] scummvm master -> 49a811c5fb8bc70daca1cca02e92e70c901154c3

bgK bastien.bouclet at gmail.com
Mon Nov 23 19:47:19 CET 2015


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

Summary:
2581c2d46f MADS: Re-enable the sprite slots handling for V2 games
f8979d60c3 MADS: Initial implementation of sound driver handling for V2 games
e6a14f403f MADS: The intro animations of Phantom and Dragon work now
f83b839e21 MADS: Initial implementation of the Phantom globals class
e0a3e9c38c MADS: Start splitting some verbs from the nouns in Phantom
72f434d5f8 MADS: Remove dead code
7960eb7835 MADS: Initial (very incomplete) implementation of Phantom scene 102
b212e2c6ed MADS: New conversation message logic for cutscene animations
262c7396d0 MADS: Fix to exit game safely when sound driver hasn't been created
d8b1612f1a MADS: Implement subtitles for animation cutscenes
b25b398152 MADS: Fix clearing on-screen messages when the cutscene animation changes
eb84b13700 MADS: Correct the color for the top/bottom line bounding the cutscene
d3cfa8cc03 MADS: Bugfix for the text view debugger command
673537bad9 MADS: Move all the anim and text view code into a common class
e5296ebf8d Merge branch 'master' into phantom
2356501d34 Merge branch 'master' into phantom
63ad675abf MADS: Allow multiple animations for Phantom and later games
7fbbf51593 MADS: Phantom - Implement Scene1xx functions
3ffa01ec2a MADS: Phantom: Implement Scene101::enter(), add some empty (new) engine functions
692e45a6e6 MADS: Phantom: Add a check on conversation restore in scene 1XX, rework some checks
12a1393faf MADS: Phantom: Add some more logic for scene 101
c275e304df MADS: Phantom: Rewrite logic for Scene102
79fbcb96c3 MADS: Add logic for scene 103, some rework on animations
b5167ceef6 MADS: Phantom: Fix calls to addSpriteCycle, remove duplicated sequence function
1d4e56c455 MADS: Phantom: Some renaming
2c59f4932e MADS: Phantom: Implement logic for scene 104
530c3303c6 MADS: Phantom: Fix some code formatting
abd7d58633 MADS: Phantom: Add logic for scene 105
f6db784f50 MADS: Phantom: Fix several calls to startPingPongCycle, addSpriteCycle and addReverseSpriteCycle
9519fb3a86 MADS: Phantom: Fix hotspot rects, remove some dead code
08cbf3d843 MADS: Phantom: Fix code formatting
aa61aabdaf MADS: Phantom: Implement scene 106
5f3c0cf63a MADS: Phantom: Add logic for scene 107
7a56c52c89 MADS: Phantom: Fix some hotspot rects in scene 103, implement scene 108
3488f05585 MADS: Phantom: Some renaming in scene 108
7a6bc4f8cf MADS: Phantom: Implement scene 109
1ce678fddb MADS: Phantom: Implement scene 110
8d7872272f MADS: Phantom: Move "lock" to the list of verbs
808ef06339 MADS: Phantom: Implement scene 111. Remove dead 'breaks'.
340016f423 MADS: Phantom: Implement scene 112
e2d86c3248 MADS: Phantom: Implement scene 113, some renaming
5b02ca1316 MADS: Phantom: Fix calls to setDynamicAnim in Scene 101
3864ad17ac MADS: Phantom: Some refactoring and renaming
44a28dbd49 MADS: Phantom: Move Exit and Climb to verbs. Review calls to isAction, use isObject instead when needed
4e0b3ca04b MADS: Phantom: Implement scene 114
0b046f848a MADS: Phantom: Add scene 150
52d035e962 MADS: Phantom: Implement SequenceList::addStampCycle()
d7ba77cfe6 MADS: Phantom: Implement loadSpeech() and playSpeech()
d22a997cb2 MADS: Get rid of SequenceList::setRange, use SequenceList::setAnimRange instead
d12d110543 MADS: Phantom: Increase maximum dynamic hotspots to 10, up from 8
51365c11ca MADS: Phantom: Fix loadAnimation and silence warning in animations_tick
e232c9fdb6 MADS: Phantom: Implement resetFacing()
80dae7b8fc MADS: Phantom: Initial work on hotspots with dynamic animations
9bfa51ef30 MADS: Phantom: Expand the existing camera adjustment logic for V2 games
fac601ae2e MADS: Fix typo
51d5f6c2b8 MADS: Phantom: Implement deleteSequence()
a2bd9b524e MADS: Phantom: Better checking for scene codes
6a14396d73 MADS: Dragon: Better checking for scene codes
5e6dbbef4c MADS: Phantom: Add Scene Group 2 generic functions
cbbfeb0171 MADS: Phantom: Implement scene 201
9bb46f2af3 MADS: Phantom: Some renaming in scene 113
2856020c37 MADS: Dragon: Add generic scene for group 1
43065c9ee2 MADS: Dragon: Implement scene 101
91bc69b1a3 MADS: Phantom: Some initial work on reading conversation files
0f27b68d57 MADS: Phantom: Disable auto camera adjust code for V2 games, for now
796b04d3cd MADS: Dragon: Implement scene 102
d26bc1937d MADS: Dragon: Implement scene 103
85c45c210e MADS: Dragon: Implement scene 104
3e979e59ef MADS: More work on V2 conversations
6fc4d50443 MADS: Phantom: Add hack in setHeroTrigger to stop conversations
86722cc41f MADS: Phantom: Initial implementation of Player::setWalkTrigger()
9aeecf83a3 MADS: Implement getFrameWidth and getFrameHeight
8422142c74 MADS: Phantom: Implement scene 202
f7389e98bc MADS: Dragon: Some rework in scene 104
2c5b63acfa MADS: Phantom: Implement scene 203
adfe7de5ab MADS: Phantom: change the type of a couple of local variables
98b52670c9 MADS: Phantom: Implement scene 204
de343a4d41 MADS: Phantom: Implement scene 205
26ae514e9d MADS: Phantom: Add scene 206
f0f5bd81ee MADS: Phantom: Implement scene 207
18683f98b0 MADS: Phantom: Implement scene 208
8aa06b4dd9 MADS: Phantom: Implement scene 250
892565069c MADS: Phantom: Add generic class Scene3xx
cb72286b34 MADS: Phantom: Set scaling velocity in generic classes Scene1xx and Scene2xx
49a5b194d0 MADS: Phantom: Rewrite some comments
cbb302a550 MADS: Phantom: Implement scene 301
b2a07f52f4 MADS: Phantom: Implement scene 302
b06b0ef872 MADS: Janitorial: Remove trailing spaces and tabs
58c94024a0 MADS: Phantom: Add scene 303
b5e787cd35 MADS: Phantom: Polish scene 303, add scene 304
0db7c488ea MADS: Phantom: Add scene 305
90e7f030c3 MADS: Phantom: Implement scene 306
4552a9026c MADS: Phantom: Implement scene 307
49ef6339ee MADS: Phantom: Implement scene 308
c21bf3cf38 MADS: Phantom: Implement scene 309
73614e9415 MADS: Use uint32 for frame timer functions
af7a233d97 MADS: Phantom: Implement scene 310
11753df6ff MADS: Phantom: Implement generic scene 4xx
bd1f03ee6c MADS: Phantom: Hook scene 310
7c4f6bae20 MADS: Phantom: Implement scene 401
71ea3ce562 MADS: Phantom: Implement scene 403
f2e17d83fe MADS: Phantom: Implement scene 404
89684642bb MADS: Phantom: Add scene 406
2243a976ce MADS: Phantom: Implement scene 407
6c53d6b391 MADS: Phantom: Implement scene 408
d449751c39 MADS: Phantom: Implement scene 409
70de0278af MADS: Phantom: Remove parasite character which breaks compilation
a7ebf1b755 MADS: Phantom: Implement scene 410
f94b5473b1 MADS: Phantom: Implement scene 453
1eaf7c13e0 MADS: Phantom: Janitorial - Remove extra spaces
9e675155b0 MADS: Phantom: Implement scene 456
04868be95b MADS: Phantom: Implement setupCatacombs
9d6bb85ce3 MADS: Phantom: Implement exitCatacombs
cdc564b060 MADS: Phantom: Phantom isn't naughty!
d073f5767c MADS: Phantom: Add more Catacombs functions
9ef395524e MADS: Phantom: Remove obsolete comment, fix the use of a boolean
75ee599cbb MADS: Phantom: Implement generic scene 5xx
4682aec147 MADS: Phantom: Implement scene 501
8920632798 MADS: Phantom: Implement scene 502 (except palette cycling)
dcf931f0bb MADS: Phantom: Improve a bit Scene502::getPanelInfo
178e45f4d9 MADS: Phantom: Initialize missing scene info so that Raoul is visible
1b75381b98 MADS: Phantom: Implement scene 504
f6e38119ec MADS: Phantom: More work on V2 scene data
41a6750d96 MADS: Phantom: Implement scene 505
98d1363041 MADS: Phantom: Add scene 506
7bd86b84a9 MADS: Phantom: Remove an erroneous TODO
8a74ec9da9 MADS: Phantom: Fix coding style in Scene1xx
47f43770ae MADS: Phantom: Only force a reset of scaling velocity when the section changes
bff5a3e680 MADS: Phantom: Implement Scene::drawToBackground()
d09d68ef70 MADS: Phantom: Fix bug in Scene102::enter()
ff4d0b9f54 MADS: Phantom: Update the definition of drawToBackground()
9abf901c28 MADS: Phantom: Implement doObjectAction()
b177f6326f MADS: Phantom: Implement unhandledAction()
925dc6b158 MADS: Phantom: Implement stopWalker()
34d5f929ac MADS: Remove useless casts in per-game logic
b7d4536cf1 MADS: Phantom: Update erroneous comments concerning Section Handlers
cbb26351f1 MADS: Phantom: Remove dummy scene handler
a71fd57608 MADS: Implement SetSeqPlayer for V2+ games, replace setTrigger by addSubEntry
7fb2ec9366 MADS: Replace the use of setTimingTrigger by a call to addTimer for V2+ games
6a34a1d58f MADS: Phantom: Add a comment about changing section
1765e231d9 MADS: Phantom: Implement disableNode() and disableLine()
bbe61b4054 MADS: DRAGON: Use constants instead of hardcoded values in one call of addSprites
0f5130e491 MADS: For consistency with Rex, remove the second parameter of addSprites when its value is the default one
0195ee51e9 MADS: Implement sceneScale for v2+ games
eb9881965d MADS: Fix ANIMFLAG_DITHER value
8753ee9f95 MADS: Rename the parameter of setNextFrameTimer
002a59c540 MADS: Implement syncTimers, add SyncType enum, modify all the calls to syncTimers
a475a7f18a MADS: Rex: Use a constant when checking _mainObjectSource
ed0e6d19f8 MADS: Dragon: Implement scene 105
03fe7c6b86 MADS: Phantom: Merge _variant and _initialVariant
ec3a4b994a MADS: Some work on Camera
9dc814e03f MADS: Implement some more Camera code
b5bffa81bf MADS: Fix header
0b2c269d86 MADS: Fix posAdjust in Animation::update for v2 games
f0d17d2c06 MADS: Remove obsolete comment and add debug trace in animation code
f4c13c2360 NEWS: Add support for A:GoE
cb0e9fd886 CREDITS: Add credits for Access engine
9bf4b797d4 SHERLOCK: Remove deprecated decompression file
71905b8ad9 ACCESS: build the engine by default
0c7bde123b CREDITS: On demand of dreammaster, add m_kiewitz to Sherlock's credits
d9e2943fe6 Merge pull request #626 from dreammaster/phantom
f9868255a9 MADS: Fix compilation.
9dbaf8dd21 NEWS: Mention the Raspberry Pi port
9cf7d1ba60 MADS: Silence two GCC warnings
a12516ee18 MADS: Phantom: Reword scene101::handleAnimation0 for consistency, remove some useless variables in scene113
767ce0ddc0 MADS: Reduce the scope of a variable in panTransition
92b63ca70a MADS: Phantom: reduce the scope of a variable
bebfb0df45 MADS: Rex: Remove dead code in doObjectAction
0dbf4e53c6 MADS: Silent another cppCheck warning
1800f9d8dc BBVS: Fix bug #6954: Pathfinding bug in Prison
49a811c5fb ACCESS: AGoE - Add detection for Spanish version, provided in bug #6958


Commit: 2581c2d46f7ee66c1a5fad17464de0477c8efe75
    https://github.com/scummvm/scummvm/commit/2581c2d46f7ee66c1a5fad17464de0477c8efe75
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-14T01:57:45+03:00

Commit Message:
MADS: Re-enable the sprite slots handling for V2 games

Changed paths:
    engines/mads/scene.cpp



diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index ad24dd4..e8ba988 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -497,14 +497,12 @@ void  Scene::drawElements(ScreenTransition transitionType, bool surfaceFlag) {
 	_dirtyAreas.copy(&_backgroundSurface, &_vm->_screen, _posAdjust);
 
 	// Handle dirty areas for foreground objects
-	if (_vm->getGameID() == GType_RexNebular)	// TODO: Implement for V2 games
-		_spriteSlots.setDirtyAreas();
+	_spriteSlots.setDirtyAreas();
 	_textDisplay.setDirtyAreas2();
 	_dirtyAreas.merge(1, DIRTY_AREAS_SIZE);
 
 	// Draw sprites that have changed
-	if (_vm->getGameID() == GType_RexNebular)	// TODO: Implement for V2 games
-		_spriteSlots.drawSprites(&_sceneSurface);
+	_spriteSlots.drawSprites(&_sceneSurface);
 
 	// Draw text elements onto the view
 	_textDisplay.draw(&_vm->_screen);


Commit: f8979d60c3479cd617fa048b83cd3c9c96e3f32e
    https://github.com/scummvm/scummvm/commit/f8979d60c3479cd617fa048b83cd3c9c96e3f32e
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-14T01:59:53+03:00

Commit Message:
MADS: Initial implementation of sound driver handling for V2 games

Changed paths:
    engines/mads/nebular/menu_nebular.cpp



diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp
index 3919e70..881481b 100644
--- a/engines/mads/nebular/menu_nebular.cpp
+++ b/engines/mads/nebular/menu_nebular.cpp
@@ -902,7 +902,11 @@ void AnimationView::loadNextResource() {
 		const char *chP = strchr(_currentAnimation->_header._soundName.c_str(), '.');
 		assert(chP);
 
-		int driverNum = atoi(chP + 1);
+		// Handle both Rex naming (xxx.009) and naming in later games (e.g. xxx.ph9)
+		int driverNum = atoi(chP + 3);
+		// HACK for Dragon
+		if (_currentAnimation->_header._soundName == "#SOUND.DRG")
+			driverNum = 9;
 		_vm->_sound->init(driverNum);
 	}
 


Commit: e6a14f403ff3bf0b42eae8fb91086ddec0e48752
    https://github.com/scummvm/scummvm/commit/e6a14f403ff3bf0b42eae8fb91086ddec0e48752
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-14T02:01:00+03:00

Commit Message:
MADS: The intro animations of Phantom and Dragon work now

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes.cpp
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
index f32d17d..dbf1759 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
@@ -201,6 +201,10 @@ Common::String DragonsphereScene::formAnimName(char sepChar, int suffixNum) {
 /*------------------------------------------------------------------------*/
 
 void SceneInfoDragonsphere::loadCodes(MSurface &depthSurface, int variant) {
+	// The intro scenes do not have any codes
+	if (_sceneId >= 900)
+		return;
+
 	Common::String ext = Common::String::format(".WW%d", variant);
 	File f(Resources::formatName(RESPREFIX_RM, _sceneId, ext));
 	MadsPack codesPack(&f);
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 7fd7ce6..2028f24 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -169,6 +169,10 @@ Common::String PhantomScene::formAnimName(char sepChar, int suffixNum) {
 /*------------------------------------------------------------------------*/
 
 void SceneInfoPhantom::loadCodes(MSurface &depthSurface, int variant) {
+	// The intro scenes do not have any codes
+	if (_sceneId >= 900)
+		return;
+
 	Common::String ext = Common::String::format(".WW%d", variant);
 	File f(Resources::formatName(RESPREFIX_RM, _sceneId, ext));
 	MadsPack codesPack(&f);


Commit: f83b839e21c6f79a008c34666ddd96d8fdc3b15c
    https://github.com/scummvm/scummvm/commit/f83b839e21c6f79a008c34666ddd96d8fdc3b15c
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-14T02:03:53+03:00

Commit Message:
MADS: Initial implementation of the Phantom globals class

Changed paths:
  A engines/mads/phantom/globals_phantom.cpp
  A engines/mads/phantom/globals_phantom.h
    engines/mads/module.mk
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h



diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 96353e9..a954494 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -4,6 +4,7 @@ MODULE_OBJS := \
 	dragonsphere/game_dragonsphere.o \
 	dragonsphere/dragonsphere_scenes.o \
 	phantom/game_phantom.o \
+	phantom/globals_phantom.o \
 	phantom/phantom_scenes.o \
 	nebular/dialogs_nebular.o \
 	nebular/game_nebular.o \
diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 0b2531e..2384b94 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -28,7 +28,7 @@
 #include "mads/msurface.h"
 #include "mads/phantom/game_phantom.h"
 //#include "mads/nebular/dialogs_nebular.h"
-//#include "mads/nebular/globals_nebular.h"
+#include "mads/phantom/globals_phantom.h"
 #include "mads/phantom/phantom_scenes.h"
 
 namespace MADS {
@@ -57,6 +57,8 @@ void GamePhantom::initializeGlobals() {
 	_player._facing = FACING_NORTH;
 	_player._turnToFacing = FACING_NORTH;
 
+	_globals[kCurrentYear] = 1993;
+
 	/* Section #1 variables */
 	// TODO
 
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 99cc2c1..654ec86 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -26,7 +26,7 @@
 #include "common/scummsys.h"
 #include "mads/game.h"
 #include "mads/globals.h"
-//#include "mads/nebular/globals_nebular.h"
+#include "mads/phantom/globals_phantom.h"
 
 namespace MADS {
 
@@ -64,15 +64,6 @@ enum InventoryObject {
 	OBJ_OAR = 24
 };
 
-// HACK: A stub for now, remove from here once it's implemented properly
-class PhantomGlobals : public Globals {
-public:
-	PhantomGlobals() {
-		resize(210);	// Rex has 210 globals
-	}
-	virtual ~PhantomGlobals() {}
-};
-
 class GamePhantom : public Game {
 	friend class Game;
 protected:
diff --git a/engines/mads/phantom/globals_phantom.cpp b/engines/mads/phantom/globals_phantom.cpp
new file mode 100644
index 0000000..e0db0a1
--- /dev/null
+++ b/engines/mads/phantom/globals_phantom.cpp
@@ -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.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "mads/phantom/globals_phantom.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+PhantomGlobals::PhantomGlobals()
+	: Globals() {
+	// Initialize lists
+	resize(210);
+	_spriteIndexes.resize(30);
+	_sequenceIndexes.resize(30);
+}
+
+void PhantomGlobals::synchronize(Common::Serializer &s) {
+	Globals::synchronize(s);
+
+	_spriteIndexes.synchronize(s);
+	_sequenceIndexes.synchronize(s);
+}
+
+
+} // End of namespace Phantom
+
+} // End of namespace MADS
diff --git a/engines/mads/phantom/globals_phantom.h b/engines/mads/phantom/globals_phantom.h
new file mode 100644
index 0000000..44d8c9e
--- /dev/null
+++ b/engines/mads/phantom/globals_phantom.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 MADS_GLOBALS_PHANTOM_H
+#define MADS_GLOBALS_PHANTOM_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "mads/game.h"
+#include "mads/resources.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+enum GlobalId {
+	kWalkerTiming           = 0,
+//	kWalkerTiming0			= 1,
+
+	kCurrentYear            = 10,	// current year (1881 or 1993)
+
+	//kTalkInanimateCount		= 4,
+
+	/* Section #1 variables */
+
+	/* Section #2 variables */
+
+	/* Section #3 Variables */
+
+	/* Section #4 Variables */
+
+	/* Section #5 Variables */
+
+};
+
+class PhantomGlobals : public Globals {
+public:
+	SynchronizedList _spriteIndexes;
+	SynchronizedList _sequenceIndexes;
+public:
+	/**
+	 * Constructor
+	 */
+	PhantomGlobals();
+
+	/**
+	* Synchronize the globals data
+	*/
+	virtual void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace Phantom
+
+} // End of namespace MADS
+
+#endif /* MADS_GLOBALS_PHANTOM_H */


Commit: e0a3e9c38c5e4e455fb0101cd82ca8ba53471a06
    https://github.com/scummvm/scummvm/commit/e0a3e9c38c5e4e455fb0101cd82ca8ba53471a06
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-14T02:05:53+03:00

Commit Message:
MADS: Start splitting some verbs from the nouns in Phantom

Changed paths:
    engines/mads/phantom/phantom_scenes.h



diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index cd295a2..e761893 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -34,6 +34,17 @@ namespace MADS {
 
 namespace Phantom {
 
+enum Verb {
+	VERB_LOOK_AT = 0x60,
+	VERB_TURN_OFF = 0x95,
+	VERB_TURN_ON = 0x96,
+	VERB_UNLOCK = 0x97,
+	VERB_WALK_ACROSS = 0x99,
+	VERB_WALK_DOWN = 0x9A,
+	VERB_WALK_THROUGH = 0x9B,
+	VERB_WALK_UP = 0x9C,
+};
+
 enum Noun {
 	NOUN_GAME = 0x1,
 	NOUN_QSAVE = 0x2,
@@ -130,7 +141,6 @@ enum Noun {
 	NOUN_LOCK = 0x5D,
 	NOUN_LOCKING_RAIL = 0x5E,
 	NOUN_LOCKRAIL = 0x5F,
-	NOUN_LOOK_AT = 0x60,
 	NOUN_LOOK_THROUGH = 0x61,
 	NOUN_MANNEQUINS = 0x62,
 	NOUN_MIRROR = 0x63,
@@ -183,14 +193,7 @@ enum Noun {
 	NOUN_TICKET = 0x92,
 	NOUN_TRAP_CEILING = 0x93,
 	NOUN_TRAP_DOOR = 0x94,
-	NOUN_TURN_OFF = 0x95,
-	NOUN_TURN_ON = 0x96,
-	NOUN_UNLOCK = 0x97,
 	NOUN_URN = 0x98,
-	NOUN_WALK_ACROSS = 0x99,
-	NOUN_WALK_DOWN = 0x9A,
-	NOUN_WALK_THROUGH = 0x9B,
-	NOUN_WALK_UP = 0x9C,
 	NOUN_WALL = 0x9D,
 	NOUN_WARDROBE = 0x9E,
 	NOUN_WASTE_BASKET = 0x9F,


Commit: 72f434d5f82b123034bbcd38df10bebf2540984c
    https://github.com/scummvm/scummvm/commit/72f434d5f82b123034bbcd38df10bebf2540984c
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-14T02:08:00+03:00

Commit Message:
MADS: Remove dead code

Changed paths:
    engines/mads/phantom/phantom_scenes.h



diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index e761893..0d7bc25 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -485,27 +485,6 @@ protected:
 };
 
 // TODO: Temporary, remove once implemented properly
-class Scene1xx : public PhantomScene {
-protected:
-	/**
-	 * Plays an appropriate sound when entering a scene
-	 */
-	void sceneEntrySound() {}
-
-	/**
-	 *Sets the AA file to use for the scene
-	 */
-	void setAAName() {}
-
-	/**
-	 * Updates the prefix used for getting player sprites for the scene
-	 */
-	void setPlayerSpritesPrefix() {}
-public:
-	Scene1xx(MADSEngine *vm) : PhantomScene(vm) {}
-};
-
-// TODO: Temporary, remove once implemented properly
 class DummyScene : public PhantomScene {
 public:
 	DummyScene(MADSEngine *vm) : PhantomScene(vm) {


Commit: 7960eb78354ddbce338782c861d6489829a0449d
    https://github.com/scummvm/scummvm/commit/7960eb78354ddbce338782c861d6489829a0449d
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-14T02:08:52+03:00

Commit Message:
MADS: Initial (very incomplete) implementation of Phantom scene 102

Changed paths:
  A engines/mads/phantom/phantom_scenes1.cpp
  A engines/mads/phantom/phantom_scenes1.h
    engines/mads/module.mk
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index a954494..8a792a7 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS := \
 	phantom/game_phantom.o \
 	phantom/globals_phantom.o \
 	phantom/phantom_scenes.o \
+	phantom/phantom_scenes1.o \
 	nebular/dialogs_nebular.o \
 	nebular/game_nebular.o \
 	nebular/globals_nebular.o \
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 2028f24..c8faa35 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -28,6 +28,7 @@
 #include "mads/scene.h"
 #include "mads/phantom/game_phantom.h"
 #include "mads/phantom/phantom_scenes.h"
+#include "mads/phantom/phantom_scenes1.h"
 
 namespace MADS {
 
@@ -44,7 +45,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 101:	// seats
 		return new DummyScene(vm);	// TODO
 	case 102:	// music stands
-		return new DummyScene(vm);	// TODO
+		return new Scene102(vm);
 	case 103:	// below stage
 		return new DummyScene(vm);	// TODO
 	case 104:	// stage
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
new file mode 100644
index 0000000..b4035dc
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -0,0 +1,182 @@
+/* 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/scummsys.h"
+#include "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+#include "mads/phantom/phantom_scenes1.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+void Scene1xx::setAAName() {
+	// TODO
+	//int idx = 0;
+	//_game._aaName = Resources::formatAAName(idx);
+}
+
+void Scene1xx::sceneEntrySound() {
+	// TODO
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) {
+	_animRunningFl = false;
+}
+
+void Scene102::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_animRunningFl);
+}
+
+void Scene102::setup() {
+	//setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene102::enter() {
+	_animRunningFl = false;
+
+	// TODO: Load sprite series
+
+	if (_scene->_priorSceneId == 101) {
+		_game._player._playerPos = Common::Point(97, 79);
+		_game._player._facing = FACING_SOUTHEAST;
+		// TODO
+	} else if (_scene->_priorSceneId == 104) {
+		// Player fell from pit -> death
+		// TODO
+	} else if (_scene->_priorSceneId == 103 || _scene->_priorSceneId != -1) {
+		_game._player._playerPos = Common::Point(282, 145);
+		_game._player._facing = FACING_WEST;
+		// TODO: Door closing animation
+		_animRunningFl = true;
+	} else if (_scene->_priorSceneId == -1) {
+		// TODO
+	}
+
+	sceneEntrySound();
+}
+
+void Scene102::step() {
+	if (_game._trigger == 60) {		// Door closes
+		// TODO
+		_animRunningFl = false;
+	} else if (_game._trigger == 65) {		// Death
+		// TODO
+		_scene->_currentSceneId = 104;
+	}
+}
+
+void Scene102::preActions() {
+	if (_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR) || _action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR)) {
+		_game._player.walk(Common::Point(282, 145), FACING_EAST);
+	}
+}
+
+void Scene102::actions() {
+	if (_action.isAction(VERB_WALK_DOWN, NOUN_AISLE)) {
+		_scene->_nextSceneId = 101;
+		_game._player._stepEnabled = true;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ORCHESTRA_DOOR) ||
+		_action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR) ||
+		_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR)) {
+		if (_animRunningFl) {
+			// TODO
+		} else {
+			switch (_game._trigger) {
+			case 70:	// try again
+			case 0:
+				// TODO
+				break;
+			case 1:
+				_scene->_nextSceneId = 103;
+				break;
+			}
+		}
+
+		_game._player._stepEnabled = true;
+	}
+
+	// TODO: Look around
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_PIT))
+			_vm->_dialogs->show(10211);
+		else if (_action.isObject(NOUN_SEATS))
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->show(10212);
+			else
+				_vm->_dialogs->show(10230);
+		else if (_action.isObject(NOUN_ORCHESTRA_DOOR))
+			_vm->_dialogs->show(10213);
+		else if (_action.isObject(NOUN_CONDUCTORS_STAND))
+			_vm->_dialogs->show(10214);
+		else if (_action.isObject(NOUN_MUSIC_STAND) || _action.isObject(NOUN_MUSIC_STANDS))
+			_vm->_dialogs->show(10215);
+		else if (_action.isObject(NOUN_PROMPTERS_BOX))
+			_vm->_dialogs->show(10217);
+		else if (_action.isObject(NOUN_STAGE))
+			_vm->_dialogs->show(10218);
+		else if (_action.isObject(NOUN_APRON))
+			_vm->_dialogs->show(10219);
+		else if (_action.isObject(NOUN_SIDE_WALL))
+			_vm->_dialogs->show(10220);
+		else if (_action.isObject(NOUN_FOLDING_CHAIRS))
+			_vm->_dialogs->show(10221);
+		else if (_action.isObject(NOUN_AISLE))
+			_vm->_dialogs->show(10222);
+		else if (_action.isObject(NOUN_PROSCENIUM_ARCH))
+			_vm->_dialogs->show(10223);
+		else if (_action.isObject(NOUN_ACT_CURTAIN))
+			_vm->_dialogs->show(10224);
+		else if (_action.isObject(NOUN_IN_ONE))
+			_vm->_dialogs->show(10225);
+		else if (_action.isObject(NOUN_IN_TWO))
+			_vm->_dialogs->show(10226);
+		else if (_action.isObject(NOUN_LEG))
+			_vm->_dialogs->show(10227);
+		else if (_action.isObject(NOUN_CHANDELIER))
+			_vm->_dialogs->show(10231);
+		else
+			return;
+
+		_game._player._stepEnabled = true;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_ORCHESTRA_DOOR)) {
+		_vm->_dialogs->show(10228);
+		_game._player._stepEnabled = true;
+	}
+}
+
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Phantom
+} // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
new file mode 100644
index 0000000..ef2cdb7
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -0,0 +1,74 @@
+/* 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 MADS_PHANTOM_SCENES1_H
+#define MADS_PHANTOM_SCENES1_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+class Scene1xx : public PhantomScene {
+protected:
+	/**
+	 * Plays an appropriate sound when entering a scene
+	 */
+	void sceneEntrySound();
+
+	/**
+	 *Sets the AA file to use for the scene
+	 */
+	void setAAName();
+
+	/**
+	 * Updates the prefix used for getting player sprites for the scene
+	 */
+	void setPlayerSpritesPrefix();
+public:
+	Scene1xx(MADSEngine *vm) : PhantomScene(vm) {}
+};
+
+class Scene102 : public Scene1xx {
+private:
+	bool _animRunningFl;
+
+public:
+	Scene102(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
+} // End of namespace Phantom
+} // End of namespace MADS
+
+#endif /* MADS_PHANTOM_SCENES1_H */


Commit: b212e2c6ed5060dba5d5d58c8391c32dfb9f354e
    https://github.com/scummvm/scummvm/commit/b212e2c6ed5060dba5d5d58c8391c32dfb9f354e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2014-10-14T11:17:31+03:00

Commit Message:
MADS: New conversation message logic for cutscene animations

Changed paths:
    engines/mads/animation.cpp
    engines/mads/animation.h
    engines/mads/nebular/menu_nebular.cpp
    engines/mads/palette.cpp
    engines/mads/palette.h



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index 0807d8e..bc3708b 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -159,6 +159,7 @@ Animation *Animation::init(MADSEngine *vm, Scene *scene) {
 }
 
 Animation::Animation(MADSEngine *vm, Scene *scene) : _vm(vm), _scene(scene) {
+	_flags = 0;
 	_font = nullptr;
 	_resetFlag = false;
 	_messageCtr = 0;
@@ -174,6 +175,8 @@ Animation::Animation(MADSEngine *vm, Scene *scene) : _vm(vm), _scene(scene) {
 	_actionDetails._indirectObjectId = -1;
 	_currentFrame = 0;
 	_oldFrameEntry = 0;
+	_rgbResult = -1;
+	_palIndex1 = _palIndex2 = -1;
 }
 
 Animation::~Animation() {
@@ -204,6 +207,7 @@ void Animation::load(MSurface &backSurface, DepthSurface &depthSurface,
 
 	if (_header._bgType == ANIMBG_INTERFACE)
 		flags |= PALFLAG_RESERVED;
+	_flags = flags;
 
 	if (flags & ANIMFLAG_LOAD_BACKGROUND) {
 		loadBackground(backSurface, depthSurface, _header, flags, palCycles, sceneInfo);
@@ -414,6 +418,7 @@ bool Animation::hasScroll() const {
 
 void Animation::update() {
 	Scene &scene = _vm->_game->_scene;
+	Palette &palette = *_vm->_palette;
 
 	if (_header._manualFlag) {
 		int spriteListIndex = _spriteListIndexes[_header._spritesIndex];
@@ -532,26 +537,42 @@ void Animation::update() {
 		} else if ((_currentFrame >= _messages[idx]._startFrame) && (_currentFrame <= _messages[idx]._endFrame)) {
 			// Start displaying the message
 			AnimMessage &me = _messages[idx];
+			uint8 colIndex1, colIndex2;
+
+			if (_flags & ANIMFLAG_ANIMVIEW) {
+				_rgbResult = palette._paletteUsage.checkRGB(me._rgb1, -1, true, &_palIndex1);
+				_rgbResult = palette._paletteUsage.checkRGB(me._rgb2, _rgbResult, true, &_palIndex2);
+
+				// Update the palette with the two needed colors
+				int palCount = _palIndex2 - _palIndex1;
+				if (palCount < 0)
+					palCount = _palIndex1 - _palIndex2 + 1;
+				palette.setPalette(palette._mainPalette, MIN(_palIndex1, _palIndex2), palCount);
+
+				colIndex1 = _palIndex1;
+				colIndex2 = _palIndex2;
+			} else {
+				// The color index to use is dependant on how many messages are currently on-screen
+				switch (_messageCtr) {
+				case 1:
+					colIndex1 = 252;
+					break;
+				case 2:
+					colIndex1 = 16;
+					break;
+				default:
+					colIndex1 = 250;
+					break;
+				}
+				colIndex2 = colIndex1 + 1;
 
-			// The color index to use is dependant on how many messages are currently on-screen
-			uint8 colIndex;
-			switch (_messageCtr) {
-			case 1:
-				colIndex = 252;
-				break;
-			case 2:
-				colIndex = 16;
-				break;
-			default:
-				colIndex = 250;
-				break;
+				_vm->_palette->setEntry(colIndex1, me._rgb1[0], me._rgb1[1], me._rgb1[2]);
+				_vm->_palette->setEntry(colIndex2, me._rgb2[0], me._rgb2[1], me._rgb2[2]);
 			}
 
-			_vm->_palette->setEntry(colIndex, me._rgb1[0], me._rgb1[1], me._rgb1[2]);
-			_vm->_palette->setEntry(colIndex + 1, me._rgb2[0], me._rgb2[1], me._rgb2[2]);
-
 			// Add a kernel message to display the given text
-			me._kernelMsgIndex = scene._kernelMessages.add(me._pos, colIndex * 0x101 + 0x100,
+			me._kernelMsgIndex = scene._kernelMessages.add(me._pos,
+				colIndex1 | (colIndex2 << 8),
 				0, 0, INDEFINITE_TIMEOUT, me._msg);
 			assert(me._kernelMsgIndex >= 0);
 			++_messageCtr;
diff --git a/engines/mads/animation.h b/engines/mads/animation.h
index 917d899..b7e98e7 100644
--- a/engines/mads/animation.h
+++ b/engines/mads/animation.h
@@ -37,7 +37,8 @@ enum AnimFlag {
 	ANIMFLAG_DITHER				= 0x1000,	// Dither to 16 colors
 	ANIMFLAG_CUSTOM_FONT		= 0x2000,	// Load ccustom font
 	ANIMFLAG_LOAD_BACKGROUND	= 0x0100,	// Load background
-	ANIMFLAG_LOAD_BACKGROUND_ONLY = 0x0200	// Load background only
+	ANIMFLAG_LOAD_BACKGROUND_ONLY = 0x0200,	// Load background only
+	ANIMFLAG_ANIMVIEW			= 0x8000	// Cutscene animation
 };
 
 enum AnimBgType {
@@ -155,6 +156,9 @@ private:
 	uint32 _nextScrollTimer;
 	int _messageCtr;
 	int _trigger;
+	int _flags;
+	int _rgbResult;
+	int _palIndex1, _palIndex2;
 	TriggerMode _triggerMode;
 	ActionDetails _actionDetails;
 
diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp
index 881481b..5cb175e 100644
--- a/engines/mads/nebular/menu_nebular.cpp
+++ b/engines/mads/nebular/menu_nebular.cpp
@@ -890,9 +890,9 @@ void AnimationView::loadNextResource() {
 	// Load the new animation
 	delete _currentAnimation;
 	_currentAnimation = Animation::init(_vm, &scene);
+	int flags = ANIMFLAG_ANIMVIEW | (resEntry._bgFlag ? ANIMFLAG_LOAD_BACKGROUND : 0);
 	_currentAnimation->load(scene._backgroundSurface, scene._depthSurface, 
-		resEntry._resourceName, resEntry._bgFlag ? ANIMFLAG_LOAD_BACKGROUND : 0,
-		&paletteCycles, _sceneInfo);
+		resEntry._resourceName, flags, &paletteCycles, _sceneInfo);
 
 	// Signal for a screen refresh
 	scene._spriteSlots.fullRefresh();
diff --git a/engines/mads/palette.cpp b/engines/mads/palette.cpp
index c098e23..1787b3c 100644
--- a/engines/mads/palette.cpp
+++ b/engines/mads/palette.cpp
@@ -317,6 +317,62 @@ int PaletteUsage::rgbFactor(byte *palEntry, RGB6 &pal6) {
 	return total;
 }
 
+int PaletteUsage::checkRGB(const byte *rgb, int palStart, bool flag, int *palIndex) {
+	Palette &palette = *_vm->_palette;
+	bool match = false;
+	int result;
+	if (palStart >= 0) {
+		result = palStart;
+	} else {
+		result = -1;
+		for (int i = 0; i < palette._highRange; ++i) {
+			if (!palette._rgbList[i]) {
+				result = i;
+				break;
+			}
+		}
+	}
+
+	if (result >= 0) {
+		int mask = 1 << result;
+		byte *palP = &palette._mainPalette[0];
+		uint32 *flagsP = &palette._palFlags[0];
+
+		for (; flagsP < &palette._palFlags[PALETTE_COUNT]; ++flagsP, ++result) {
+			if ((!(*flagsP & 1) || flag) && !(*flagsP & 2)) {
+				if (!memcmp(palP, rgb, 3)) {
+					*flagsP |= mask;
+					
+					if (palIndex)
+						*palIndex = result;
+					match = true;
+					break;
+				}
+			}
+		}
+
+		if (!match) {
+			palP = &palette._mainPalette[0];
+			flagsP = &palette._palFlags[0];
+
+			for (int i = 0; i < PALETTE_COUNT; ++i, palP += 3, ++flagsP) {
+				if (!*flagsP) {
+					Common::copy(rgb, rgb + 3, palP);
+					*flagsP |= mask;
+
+					if (palIndex)
+						*palIndex = i;
+					match = true;
+					break;
+				}
+			}
+		}
+	}
+
+	assert(match);
+	return result;
+}
+
 /*------------------------------------------------------------------------*/
 
 void RGBList::clear() {
diff --git a/engines/mads/palette.h b/engines/mads/palette.h
index 9b8b714..27d25f2 100644
--- a/engines/mads/palette.h
+++ b/engines/mads/palette.h
@@ -136,6 +136,8 @@ public:
 	void updateUsage(Common::Array<int> &usageList, int sceneUsageIndex);
 
 	void resetPalFlags(int idx);
+
+	int checkRGB(const byte *rgb, int palStart, bool flag, int *palIndex);
 };
 
 class RGBList {


Commit: 262c7396d0d2c15ac88d73b8d97c5f76e5815e93
    https://github.com/scummvm/scummvm/commit/262c7396d0d2c15ac88d73b8d97c5f76e5815e93
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2014-10-15T10:00:55+03:00

Commit Message:
MADS: Fix to exit game safely when sound driver hasn't been created

Changed paths:
    engines/mads/sound.cpp



diff --git a/engines/mads/sound.cpp b/engines/mads/sound.cpp
index 9d0d9c8..d0aa770 100644
--- a/engines/mads/sound.cpp
+++ b/engines/mads/sound.cpp
@@ -42,9 +42,11 @@ SoundManager::SoundManager(MADSEngine *vm, Audio::Mixer *mixer) {
 }
 
 SoundManager::~SoundManager() {
-	_driver->stop();
+	if (_driver) {
+		_driver->stop();
+		delete _driver;
+	}
 
-	delete _driver;
 	delete _opl;
 }
 


Commit: d8b1612f1a995120444c8100088682b870c43f28
    https://github.com/scummvm/scummvm/commit/d8b1612f1a995120444c8100088682b870c43f28
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2014-10-15T10:00:55+03:00

Commit Message:
MADS: Implement subtitles for animation cutscenes

Changed paths:
    engines/mads/animation.cpp
    engines/mads/animation.h
    engines/mads/nebular/menu_nebular.cpp



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index bc3708b..9f0e0ad 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -537,49 +537,44 @@ void Animation::update() {
 		} else if ((_currentFrame >= _messages[idx]._startFrame) && (_currentFrame <= _messages[idx]._endFrame)) {
 			// Start displaying the message
 			AnimMessage &me = _messages[idx];
-			uint8 colIndex1, colIndex2;
 
 			if (_flags & ANIMFLAG_ANIMVIEW) {
 				_rgbResult = palette._paletteUsage.checkRGB(me._rgb1, -1, true, &_palIndex1);
 				_rgbResult = palette._paletteUsage.checkRGB(me._rgb2, _rgbResult, true, &_palIndex2);
 
 				// Update the palette with the two needed colors
-				int palCount = _palIndex2 - _palIndex1;
-				if (palCount < 0)
-					palCount = _palIndex1 - _palIndex2 + 1;
-				palette.setPalette(palette._mainPalette, MIN(_palIndex1, _palIndex2), palCount);
-
-				colIndex1 = _palIndex1;
-				colIndex2 = _palIndex2;
+				int palStart = MIN(_palIndex1, _palIndex2);
+				int palCount = ABS(_palIndex2 - _palIndex1) + 1;
+				palette.setPalette(&palette._mainPalette[palStart * 3], palStart, palCount);
 			} else {
 				// The color index to use is dependant on how many messages are currently on-screen
 				switch (_messageCtr) {
 				case 1:
-					colIndex1 = 252;
+					_palIndex1 = 252;
 					break;
 				case 2:
-					colIndex1 = 16;
+					_palIndex1 = 16;
 					break;
 				default:
-					colIndex1 = 250;
+					_palIndex1 = 250;
 					break;
 				}
-				colIndex2 = colIndex1 + 1;
+				_palIndex2 = _palIndex1 + 1;
 
-				_vm->_palette->setEntry(colIndex1, me._rgb1[0], me._rgb1[1], me._rgb1[2]);
-				_vm->_palette->setEntry(colIndex2, me._rgb2[0], me._rgb2[1], me._rgb2[2]);
+				_vm->_palette->setEntry(_palIndex1, me._rgb1[0], me._rgb1[1], me._rgb1[2]);
+				_vm->_palette->setEntry(_palIndex2, me._rgb2[0], me._rgb2[1], me._rgb2[2]);
 			}
 
 			// Add a kernel message to display the given text
 			me._kernelMsgIndex = scene._kernelMessages.add(me._pos,
-				colIndex1 | (colIndex2 << 8),
+				_palIndex1 | (_palIndex2 << 8),
 				0, 0, INDEFINITE_TIMEOUT, me._msg);
 			assert(me._kernelMsgIndex >= 0);
 			++_messageCtr;
 
 			// If there's an accompanying sound, also play it
 			if (me._soundId > 0)
-				_vm->_audio->playSound(me._soundId);
+				_vm->_audio->playSound(me._soundId - 1);
 		}
 	}
 
diff --git a/engines/mads/animation.h b/engines/mads/animation.h
index b7e98e7..8b85a53 100644
--- a/engines/mads/animation.h
+++ b/engines/mads/animation.h
@@ -38,7 +38,7 @@ enum AnimFlag {
 	ANIMFLAG_CUSTOM_FONT		= 0x2000,	// Load ccustom font
 	ANIMFLAG_LOAD_BACKGROUND	= 0x0100,	// Load background
 	ANIMFLAG_LOAD_BACKGROUND_ONLY = 0x0200,	// Load background only
-	ANIMFLAG_ANIMVIEW			= 0x8000	// Cutscene animation
+	ANIMFLAG_ANIMVIEW			= 0x4000	// Cutscene animation
 };
 
 enum AnimBgType {
diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp
index 5cb175e..64f1b82 100644
--- a/engines/mads/nebular/menu_nebular.cpp
+++ b/engines/mads/nebular/menu_nebular.cpp
@@ -55,6 +55,8 @@ void MenuView::show() {
 
 	while (!_breakFlag && !_vm->shouldQuit()) {
 		if (_redrawFlag) {
+			scene._kernelMessages.update();
+
 			_vm->_game->_scene.drawElements(_vm->_game->_fx, _vm->_game->_fx);
 			_redrawFlag = false;
 		}


Commit: b25b3981527ff343c4959984ab3d630c6b8b4528
    https://github.com/scummvm/scummvm/commit/b25b3981527ff343c4959984ab3d630c6b8b4528
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2014-10-15T10:00:55+03:00

Commit Message:
MADS: Fix clearing on-screen messages when the cutscene animation changes

Changed paths:
    engines/mads/nebular/menu_nebular.cpp



diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp
index 64f1b82..591d745 100644
--- a/engines/mads/nebular/menu_nebular.cpp
+++ b/engines/mads/nebular/menu_nebular.cpp
@@ -889,6 +889,9 @@ void AnimationView::loadNextResource() {
 	if (resEntry._bgFlag)
 		palette.resetGamePalette(1, 8);
 
+	// Free any previous messages
+	scene._kernelMessages.reset();
+
 	// Load the new animation
 	delete _currentAnimation;
 	_currentAnimation = Animation::init(_vm, &scene);


Commit: eb84b1370087dc06f55e5afed18736c71c4a1ece
    https://github.com/scummvm/scummvm/commit/eb84b1370087dc06f55e5afed18736c71c4a1ece
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2014-10-15T10:00:55+03:00

Commit Message:
MADS: Correct the color for the top/bottom line bounding the cutscene

Changed paths:
    engines/mads/nebular/menu_nebular.cpp



diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp
index 591d745..6a13cea 100644
--- a/engines/mads/nebular/menu_nebular.cpp
+++ b/engines/mads/nebular/menu_nebular.cpp
@@ -889,9 +889,24 @@ void AnimationView::loadNextResource() {
 	if (resEntry._bgFlag)
 		palette.resetGamePalette(1, 8);
 
+	palette._mainPalette[253 * 3] = palette._mainPalette[253 * 3 + 1] 
+		= palette._mainPalette[253 * 3 + 2] = 0xb4;
+	palette.setPalette(&palette._mainPalette[253 * 3], 253, 1);
+
 	// Free any previous messages
 	scene._kernelMessages.reset();
 
+	// Handle the bars at the top/bottom
+	if (resEntry._showWhiteBars) {
+		// For animations the screen has been clipped to the middle 156 rows.
+		// So although it's slightly messy, bypass our screen class entirely,
+		// and draw the horizontal lines directly on the physiacl screen surface
+		Graphics::Surface *s = g_system->lockScreen();
+		s->hLine(0, 20, MADS_SCREEN_WIDTH, 253);
+		s->hLine(0, 179, MADS_SCREEN_WIDTH, 253);
+		g_system->unlockScreen();
+	}
+
 	// Load the new animation
 	delete _currentAnimation;
 	_currentAnimation = Animation::init(_vm, &scene);


Commit: d3cfa8cc03bf0d1f9c4927e76377acbaabd63bab
    https://github.com/scummvm/scummvm/commit/d3cfa8cc03bf0d1f9c4927e76377acbaabd63bab
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-15T10:35:49+03:00

Commit Message:
MADS: Bugfix for the text view debugger command

Changed paths:
    engines/mads/debugger.cpp



diff --git a/engines/mads/debugger.cpp b/engines/mads/debugger.cpp
index ee967cb..3b77d53 100644
--- a/engines/mads/debugger.cpp
+++ b/engines/mads/debugger.cpp
@@ -381,7 +381,7 @@ bool Debugger::Cmd_PlayText(int argc, const char **argv) {
 			resName.deleteChar(0);
 
 		Common::File f;
-		if (f.exists(resName) || f.exists(resName + ".res")) {
+		if (f.exists(resName) || f.exists(resName + ".txr")) {
 			Nebular::TextView::execute(_vm, resName);
 			return false;
 		} else {


Commit: 673537bad93f0b440172a0cc263ebf19cc95ffc0
    https://github.com/scummvm/scummvm/commit/673537bad93f0b440172a0cc263ebf19cc95ffc0
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-10-15T11:33:14+03:00

Commit Message:
MADS: Move all the anim and text view code into a common class

The animation and text players are more or less common among all MADS
games

Changed paths:
  A engines/mads/menu_views.cpp
  A engines/mads/menu_views.h
    engines/mads/debugger.cpp
    engines/mads/dialogs.cpp
    engines/mads/dialogs.h
    engines/mads/module.mk
    engines/mads/nebular/dialogs_nebular.cpp
    engines/mads/nebular/dialogs_nebular.h
    engines/mads/nebular/menu_nebular.cpp
    engines/mads/nebular/menu_nebular.h



diff --git a/engines/mads/debugger.cpp b/engines/mads/debugger.cpp
index 3b77d53..99251f9 100644
--- a/engines/mads/debugger.cpp
+++ b/engines/mads/debugger.cpp
@@ -362,7 +362,7 @@ bool Debugger::Cmd_PlayAnim(int argc, const char **argv) {
 
 		Common::File f;
 		if (f.exists(resName) || f.exists(resName + ".res")) {
-			Nebular::AnimationView::execute(_vm, resName);
+			AnimationView::execute(_vm, resName);
 			return false;
 		} else {
 			debugPrintf("Could not find resource file\n");
@@ -382,7 +382,7 @@ bool Debugger::Cmd_PlayText(int argc, const char **argv) {
 
 		Common::File f;
 		if (f.exists(resName) || f.exists(resName + ".txr")) {
-			Nebular::TextView::execute(_vm, resName);
+			TextView::execute(_vm, resName);
 			return false;
 		} else {
 			debugPrintf("Could not find resource file\n");
diff --git a/engines/mads/dialogs.cpp b/engines/mads/dialogs.cpp
index 7e6909d..5ea8fb1 100644
--- a/engines/mads/dialogs.cpp
+++ b/engines/mads/dialogs.cpp
@@ -395,4 +395,77 @@ Dialogs::Dialogs(MADSEngine *vm)
 	_pendingDialog = DIALOG_NONE;
 }
 
+/*------------------------------------------------------------------------*/
+
+FullScreenDialog::FullScreenDialog(MADSEngine *vm) : _vm(vm) {
+	switch (_vm->getGameID()) {
+	case GType_RexNebular:
+		_screenId = 990;
+		break;
+	case GType_Phantom:
+		_screenId = 920;
+		break;
+	case GType_Dragonsphere:
+		_screenId = 922;
+		break;
+	default:
+		error("FullScreenDialog:Unknown game");
+	}
+	_palFlag = true;
+}
+
+FullScreenDialog::~FullScreenDialog() {
+	_vm->_screen.resetClipBounds();
+	_vm->_game->_scene.restrictScene();
+}
+
+void FullScreenDialog::display() {
+	Game &game = *_vm->_game;
+	Scene &scene = game._scene;
+
+	int nextSceneId = scene._nextSceneId;
+	int currentSceneId = scene._currentSceneId;
+	int priorSceneId = scene._priorSceneId;
+
+	if (_screenId > 0) {
+		SceneInfo *sceneInfo = SceneInfo::init(_vm);
+		sceneInfo->load(_screenId, 0, "", 0, scene._depthSurface, scene._backgroundSurface);
+	}
+
+	scene._priorSceneId = priorSceneId;
+	scene._currentSceneId = currentSceneId;
+	scene._nextSceneId = nextSceneId;
+
+	_vm->_events->initVars();
+	game._kernelMode = KERNEL_ROOM_INIT;
+
+	byte pal[768];
+	if (_vm->_screenFade) {
+		Common::fill(&pal[0], &pal[PALETTE_SIZE], 0);
+		_vm->_palette->setFullPalette(pal);
+	} else {
+		_vm->_palette->getFullPalette(pal);
+		_vm->_palette->fadeOut(pal, nullptr, 0, PALETTE_COUNT, 0, 1, 1, 16);
+	}
+
+	// Set Fx state and palette entries
+	game._fx = _vm->_screenFade == SCREEN_FADE_SMOOTH ? kTransitionFadeIn : kCenterVertTransition;
+	game._trigger = 0;
+
+	// Clear the screen and draw the upper and lower horizontal lines
+	_vm->_screen.empty();
+	_vm->_palette->setLowRange();
+	_vm->_screen.hLine(0, 20, MADS_SCREEN_WIDTH, 2);
+	_vm->_screen.hLine(0, 179, MADS_SCREEN_WIDTH, 2);
+	_vm->_screen.copyRectToScreen(Common::Rect(0, 0, MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT));
+
+	// Restrict the screen to the area between the two lines
+	_vm->_screen.setClipBounds(Common::Rect(0, DIALOG_TOP, MADS_SCREEN_WIDTH,
+		DIALOG_TOP + MADS_SCENE_HEIGHT));
+	_vm->_game->_scene.restrictScene();
+
+	if (_screenId > 0)
+		scene._spriteSlots.fullRefresh();
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/dialogs.h b/engines/mads/dialogs.h
index c586a6f..317c7bd 100644
--- a/engines/mads/dialogs.h
+++ b/engines/mads/dialogs.h
@@ -30,6 +30,8 @@
 
 namespace MADS {
 
+#define DIALOG_TOP 22
+
 class Dialog {
 private:
 	void setDialogPalette();
@@ -226,6 +228,36 @@ public:
 	virtual bool show(int messageId, int objectId = -1) = 0;
 };
 
+class FullScreenDialog: public EventTarget {
+protected:
+	/**
+	 * Engine reference
+	 */
+	MADSEngine *_vm;
+
+	/**
+	 * Screen/scene to show background from
+	 */
+	int _screenId;
+
+	/**
+	 * Flag for palette initialization
+	 */
+	bool _palFlag;
+
+	/**
+	 * Handles displaying the screen background and dialog
+	 */
+	virtual void display();
+public:
+	/**
+	 * Constructor
+	 */
+	FullScreenDialog(MADSEngine *vm);
+
+	virtual ~FullScreenDialog();
+};
+
 } // End of namespace MADS
 
 #endif /* MADS_DIALOGS_H */
diff --git a/engines/mads/menu_views.cpp b/engines/mads/menu_views.cpp
new file mode 100644
index 0000000..6acf6cd
--- /dev/null
+++ b/engines/mads/menu_views.cpp
@@ -0,0 +1,782 @@
+/* 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/scummsys.h"
+#include "mads/game.h"
+#include "mads/mads.h"
+#include "mads/menu_views.h"
+#include "mads/resources.h"
+#include "mads/scene.h"
+#include "mads/screen.h"
+
+namespace MADS {
+
+MenuView::MenuView(MADSEngine *vm) : FullScreenDialog(vm) {
+	_breakFlag = false;
+	_redrawFlag = true;
+	_palFlag = false;
+}
+
+void MenuView::show() {
+ 	Scene &scene = _vm->_game->_scene;	
+	EventsManager &events = *_vm->_events;
+	_vm->_screenFade = SCREEN_FADE_FAST;
+
+	scene._spriteSlots.reset(true);
+	display();
+
+	events.setEventTarget(this);
+	events.hideCursor();
+
+	while (!_breakFlag && !_vm->shouldQuit()) {
+		if (_redrawFlag) {
+			scene._kernelMessages.update();
+
+			_vm->_game->_scene.drawElements(_vm->_game->_fx, _vm->_game->_fx);
+			_redrawFlag = false;
+		}
+
+		_vm->_events->waitForNextFrame();
+		_vm->_game->_fx = kTransitionNone;
+		doFrame();
+	}
+
+	events.setEventTarget(nullptr);
+	_vm->_sound->stop();
+}
+
+void MenuView::display() {
+	_vm->_palette->resetGamePalette(4, 8);
+
+	FullScreenDialog::display();
+}
+
+bool MenuView::onEvent(Common::Event &event) {
+	if (event.type == Common::EVENT_KEYDOWN || event.type == Common::EVENT_LBUTTONDOWN) {
+		_breakFlag = true;
+		_vm->_dialogs->_pendingDialog = DIALOG_MAIN_MENU;
+		return true;
+	}
+
+	return false;
+}
+
+/*------------------------------------------------------------------------*/
+
+char TextView::_resourceName[100];
+#define TEXTVIEW_LINE_SPACING 2
+#define TEXT_ANIMATION_DELAY 100
+#define TV_NUM_FADE_STEPS 40
+#define TV_FADE_DELAY_MILLI 50
+
+void TextView::execute(MADSEngine *vm, const Common::String &resName) {
+	assert(resName.size() < 100);
+	Common::strlcpy(_resourceName, resName.c_str(), sizeof(_resourceName));
+	vm->_dialogs->_pendingDialog = DIALOG_TEXTVIEW;
+}
+
+TextView::TextView(MADSEngine *vm) : MenuView(vm) {
+	_animating = false;
+	_panSpeed = 0;
+	_spareScreen = nullptr;
+	_scrollCount = 0;
+	_lineY = -1;
+	_scrollTimeout = 0;
+	_panCountdown = 0;
+	_translationX = 0;
+	_screenId = -1;
+
+	_font = _vm->_font->getFont(FONT_CONVERSATION);
+	_vm->_palette->resetGamePalette(4, 0);
+
+	load();
+}
+
+TextView::~TextView() {
+}
+
+void TextView::load() {
+	Common::String scriptName(_resourceName);
+	scriptName += ".txr";
+
+	if (!_script.open(scriptName))
+		error("Could not open resource %s", _resourceName);
+
+	processLines();
+}
+
+void TextView::processLines() {
+	if (_script.eos())
+		error("Attempted to read past end of response file");
+
+	while (!_script.eos()) {
+		// Read in the next line
+		_script.readLine(_currentLine, 79);
+		char *p = _currentLine + strlen(_currentLine) - 1;
+		if (*p == '\n')
+			*p = '\0';
+
+		// Commented out line, so go loop for another
+		if (_currentLine[0] == '#')
+			continue;
+
+		// Process the line
+		char *cStart = strchr(_currentLine, '[');
+		if (cStart) {
+			while (cStart) {
+				// Loop for possible multiple commands on one line
+				char *cEnd = strchr(_currentLine, ']');
+				if (!cEnd)
+					error("Unterminated command '%s' in response file", _currentLine);
+
+				*cEnd = '\0';
+				processCommand();
+
+				// Copy rest of line (if any) to start of buffer
+				Common::strlcpy(_currentLine, cEnd + 1, sizeof(_currentLine));
+
+				cStart = strchr(_currentLine, '[');
+			}
+
+			if (_currentLine[0]) {
+				processText();
+				break;
+			}
+
+		} else {
+			processText();
+			break;
+		}
+	}
+}
+
+void TextView::processCommand() {
+	Scene &scene = _vm->_game->_scene;
+	Common::String scriptLine(_currentLine + 1);
+	scriptLine.toUppercase();
+	const char *paramP;
+	const char *commandStr = scriptLine.c_str();
+
+	if (!strncmp(commandStr, "BACKGROUND", 10)) {
+		// Set the background
+		paramP = commandStr + 10;
+		resetPalette();
+		int screenId = getParameter(&paramP);
+		
+		SceneInfo *sceneInfo = SceneInfo::init(_vm);
+		sceneInfo->load(screenId, 0, "", 0, scene._depthSurface, scene._backgroundSurface);
+		scene._spriteSlots.fullRefresh();
+		_redrawFlag = true;
+
+	} else if (!strncmp(commandStr, "GO", 2)) {
+		_animating = true;
+
+	} else if (!strncmp(commandStr, "PAN", 3)) {
+		// Set panning values
+		paramP = commandStr + 3;
+		int panX = getParameter(&paramP);
+		int panY = getParameter(&paramP);
+		int panSpeed = getParameter(&paramP);
+
+		if ((panX != 0) || (panY != 0)) {
+			_pan = Common::Point(panX, panY);
+			_panSpeed = panSpeed;
+		}
+
+	} else if (!strncmp(commandStr, "DRIVER", 6)) {
+		// Set the driver to use
+		paramP = commandStr + 7;
+
+		if (!strncmp(paramP, "#SOUND.00", 9)) {
+			int driverNum = paramP[9] - '0';
+			_vm->_sound->init(driverNum);
+		}
+	} else if (!strncmp(commandStr, "SOUND", 5)) {
+		// Set sound number
+		paramP = commandStr + 5;
+		int soundId = getParameter(&paramP);
+		_vm->_sound->command(soundId);
+
+	} else if (!strncmp(commandStr, "COLOR", 5) && ((commandStr[5] == '0') || 
+			(commandStr[5] == '1'))) {
+		// Set the text colors
+		int index = commandStr[5] - '0';
+		paramP = commandStr + 6;
+
+		byte r = getParameter(&paramP);
+		byte g = getParameter(&paramP);
+		byte b = getParameter(&paramP);
+
+		_vm->_palette->setEntry(5 + index, r, g, b);
+
+	} else if (!strncmp(commandStr, "SPARE", 5)) {
+		// Sets a secondary background number that can be later switched in with a PAGE command
+		paramP = commandStr + 6;
+		int spareIndex = commandStr[5] - '0';
+		assert(spareIndex < 4);
+		int screenId = getParameter(&paramP);
+
+		// Load the spare background
+		SceneInfo *sceneInfo = SceneInfo::init(_vm);
+		sceneInfo->_width = MADS_SCREEN_WIDTH;
+		sceneInfo->_height = MADS_SCENE_HEIGHT;
+		_spareScreens[spareIndex].setSize(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
+		sceneInfo->loadMadsV1Background(screenId, "", SCENEFLAG_TRANSLATE, 
+			_spareScreens[spareIndex]);
+		delete sceneInfo;
+
+	} else if (!strncmp(commandStr, "PAGE", 4)) {
+		// Signals to change to a previous specified secondary background
+		paramP = commandStr + 4;
+		int spareIndex = getParameter(&paramP);
+
+		// Only allow background switches if one isn't currently in progress
+		if (!_spareScreen && _spareScreens[spareIndex].getPixels() != nullptr) {
+			_spareScreen = &_spareScreens[spareIndex];
+			_translationX = 0;
+		}
+
+	} else {
+		error("Unknown response command: '%s'", commandStr);
+	}
+}
+
+int TextView::getParameter(const char **paramP) {
+	if ((**paramP != '=') && (**paramP != ','))
+		return 0;
+
+	int result = 0;
+	++*paramP;
+	while ((**paramP >= '0') && (**paramP <= '9')) {
+		result = result * 10 + (**paramP - '0');
+		++*paramP;
+	}
+
+	return result;
+}
+
+void TextView::processText() {
+	int xStart;
+
+	if (!strcmp(_currentLine, "***")) {
+		// Special signifier for end of script
+		_scrollCount = _font->getHeight() * 13;
+		_lineY = -1;
+		return;
+	}
+
+	_lineY = 0;
+
+	// Lines are always centered, except if line contains a '@', in which case the
+	// '@' marks the position that must be horizontally centered
+	char *centerP = strchr(_currentLine, '@');
+	if (centerP) {
+		*centerP = '\0';
+		xStart = (MADS_SCREEN_WIDTH / 2) - _font->getWidth(_currentLine);
+
+		// Delete the @ character and shift back the remainder of the string
+		char *p = centerP + 1;
+		if (*p == ' ') ++p;
+		strcpy(centerP, p);
+
+	} else {
+		int lineWidth = _font->getWidth(_currentLine);
+		xStart = (MADS_SCREEN_WIDTH - lineWidth) / 2;
+	}
+
+	// Add the new line to the list of pending lines
+	TextLine tl;
+	tl._pos = Common::Point(xStart, MADS_SCENE_HEIGHT);
+	tl._line = _currentLine;
+	tl._textDisplayIndex = -1;
+	_textLines.push_back(tl);
+}
+
+void TextView::display() {
+	FullScreenDialog::display();
+}
+
+void TextView::resetPalette() {
+	_vm->_palette->resetGamePalette(8, 8);
+	_vm->_palette->setEntry(5, 0, 63, 63);
+	_vm->_palette->setEntry(6, 0, 45, 45);
+}
+
+void TextView::doFrame() {
+	Scene &scene = _vm->_game->_scene;
+	if (!_animating)
+		return;
+
+	// Only update state if wait period has expired
+	uint32 currTime = g_system->getMillis();
+
+	// If a screen transition is in progress and it's time for another column, handle it
+	if (_spareScreen) {
+		byte *srcP = _spareScreen->getBasePtr(_translationX, 0);
+		byte *bgP = scene._backgroundSurface.getBasePtr(_translationX, 0);
+		byte *screenP = (byte *)_vm->_screen.getBasePtr(_translationX, 0);
+
+		for (int y = 0; y < MADS_SCENE_HEIGHT; ++y, srcP += MADS_SCREEN_WIDTH,
+			bgP += MADS_SCREEN_WIDTH, screenP += MADS_SCREEN_WIDTH) {
+			*bgP = *srcP;
+			*screenP = *srcP;
+		}
+
+		// Flag the column of the screen is modified
+		_vm->_screen.copyRectToScreen(Common::Rect(_translationX, 0,
+			_translationX + 1, MADS_SCENE_HEIGHT));
+
+		// Keep moving the column to copy to the right
+		if (++_translationX == MADS_SCREEN_WIDTH) {
+			// Surface transition is complete
+			_spareScreen = nullptr;
+		}
+	}
+
+	// Make sure it's time for an update
+	if (currTime < _scrollTimeout)
+		return;
+	_scrollTimeout = g_system->getMillis() + TEXT_ANIMATION_DELAY;
+	_redrawFlag = true;
+
+	// If any panning values are set, pan the background surface
+	if ((_pan.x != 0) || (_pan.y != 0)) {
+		if (_panCountdown > 0) {
+			--_panCountdown;
+			return;
+		}
+
+		// Handle horizontal panning
+		if (_pan.x != 0) {
+			byte *lineTemp = new byte[_pan.x];
+			for (int y = 0; y < MADS_SCENE_HEIGHT; ++y) {
+				byte *pixelsP = (byte *)scene._backgroundSurface.getBasePtr(0, y);
+
+				// Copy the first X pixels into temp buffer, move the rest of the line
+				// to the start of the line, and then move temp buffer pixels to end of line
+				Common::copy(pixelsP, pixelsP + _pan.x, lineTemp);
+				Common::copy(pixelsP + _pan.x, pixelsP + MADS_SCREEN_WIDTH, pixelsP);
+				Common::copy(lineTemp, lineTemp + _pan.x, pixelsP + MADS_SCREEN_WIDTH - _pan.x);
+			}
+
+			delete[] lineTemp;
+		}
+
+		// Handle vertical panning
+		if (_pan.y != 0) {
+			// Store the bottom Y lines into a temp buffer, move the rest of the lines down,
+			// and then copy the stored lines back to the top of the screen
+			byte *linesTemp = new byte[_pan.y * MADS_SCREEN_WIDTH];
+			byte *pixelsP = (byte *)scene._backgroundSurface.getBasePtr(0, MADS_SCENE_HEIGHT - _pan.y);
+			Common::copy(pixelsP, pixelsP + MADS_SCREEN_WIDTH * _pan.y, linesTemp);
+
+			for (int y = MADS_SCENE_HEIGHT - 1; y >= _pan.y; --y) {
+				byte *destP = (byte *)scene._backgroundSurface.getBasePtr(0, y);
+				byte *srcP = (byte *)scene._backgroundSurface.getBasePtr(0, y - _pan.y);
+				Common::copy(srcP, srcP + MADS_SCREEN_WIDTH, destP);
+			}
+
+			Common::copy(linesTemp, linesTemp + _pan.y * MADS_SCREEN_WIDTH, 
+				(byte *)scene._backgroundSurface.getPixels());
+			delete[] linesTemp;
+		}
+
+		// Flag for a full screen refresh
+		scene._spriteSlots.fullRefresh();
+	}
+
+	// Scroll all active text lines up
+	for (int i = _textLines.size() - 1; i >= 0; --i) {
+		TextLine &tl = _textLines[i];
+		if (tl._textDisplayIndex != -1)
+			// Expire the text line that's already on-screen
+			scene._textDisplay.expire(tl._textDisplayIndex);
+
+		tl._pos.y--;
+		if (tl._pos.y < 0) {
+			_textLines.remove_at(i);
+		} else {
+			tl._textDisplayIndex = scene._textDisplay.add(tl._pos.x, tl._pos.y, 
+				0x605, -1, tl._line, _font);
+		}
+	}
+
+	if (_scrollCount > 0) {
+		// Handling final scrolling of text off of screen
+		if (--_scrollCount == 0) {
+			scriptDone();
+			return;
+		}
+	} else {
+		// Handling a text row
+		if (++_lineY == (_font->getHeight() + TEXTVIEW_LINE_SPACING))
+			processLines();
+	}
+}
+
+void TextView::scriptDone() {
+	_breakFlag = true;
+	_vm->_dialogs->_pendingDialog = DIALOG_MAIN_MENU;
+}
+
+/*------------------------------------------------------------------------*/
+
+char AnimationView::_resourceName[100];
+
+void AnimationView::execute(MADSEngine *vm, const Common::String &resName) {
+	assert(resName.size() < 100);
+	Common::strlcpy(_resourceName, resName.c_str(), sizeof(_resourceName));
+	vm->_dialogs->_pendingDialog = DIALOG_ANIMVIEW;
+}
+
+AnimationView::AnimationView(MADSEngine *vm) : MenuView(vm) {
+	_redrawFlag = false;
+
+	_soundDriverLoaded = false;
+	_previousUpdate = 0;
+	_screenId = -1;
+	_resetPalette = false;
+	_resyncMode = NEVER;
+	_v1 = 0;
+	_v2 = -1;
+	_resourceIndex = -1;
+	_currentAnimation = nullptr;
+	_sfx = 0;
+	_soundFlag = _bgLoadFlag = true;
+	_showWhiteBars = true;
+	_manualFrameNumber = 0;
+	_manualSpriteSet = nullptr;
+	_manualStartFrame = _manualEndFrame = 0;
+	_manualFrame2 = 0;
+	_animFrameNumber = 0;
+	_nextCyclingActive = false;
+	_sceneInfo = SceneInfo::init(_vm);
+
+	load();
+}
+
+AnimationView::~AnimationView() {
+	delete _currentAnimation;
+	delete _sceneInfo;
+}
+
+void AnimationView::load() {
+	Common::String resName(_resourceName);
+	if (!resName.hasSuffix("."))
+		resName += ".res";
+
+	if (!_script.open(resName))
+		error("Could not open resource %s", resName.c_str());
+
+	processLines();
+}
+
+void AnimationView::display() {
+	Scene &scene = _vm->_game->_scene;
+	_vm->_palette->initPalette();
+	Common::fill(&_vm->_palette->_cyclingPalette[0], &_vm->_palette->_cyclingPalette[PALETTE_SIZE], 0);
+
+	_vm->_palette->resetGamePalette(1, 8);
+	scene._spriteSlots.reset();
+	scene._paletteCycles.clear();
+
+	MenuView::display();
+}
+
+bool AnimationView::onEvent(Common::Event &event) {
+	// Wait for the Escape key or a mouse press
+	if (((event.type == Common::EVENT_KEYDOWN) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) ||
+			(event.type == Common::EVENT_RBUTTONUP)) {
+		scriptDone();
+		return true;
+	}
+
+	return false;
+}
+
+void AnimationView::doFrame() {
+	Scene &scene = _vm->_game->_scene;
+	
+	if (_resourceIndex == -1 || _currentAnimation->freeFlag()) {
+		if (++_resourceIndex == (int)_resources.size()) {
+			scriptDone();
+		} else {
+			scene._frameStartTime = 0;
+			loadNextResource();
+		}
+	} else if (_currentAnimation->getCurrentFrame() == 1) {
+		scene._cyclingActive = _nextCyclingActive;
+	}
+
+	if (_currentAnimation) {
+		++scene._frameStartTime;
+		_currentAnimation->update();
+		_redrawFlag = true;
+	}
+}
+
+void AnimationView::loadNextResource() {
+	Scene &scene = _vm->_game->_scene;
+	Palette &palette = *_vm->_palette;
+	ResourceEntry &resEntry = _resources[_resourceIndex];
+	Common::Array<PaletteCycle> paletteCycles;
+
+	if (resEntry._bgFlag)
+		palette.resetGamePalette(1, 8);
+
+	palette._mainPalette[253 * 3] = palette._mainPalette[253 * 3 + 1] 
+		= palette._mainPalette[253 * 3 + 2] = 0xb4;
+	palette.setPalette(&palette._mainPalette[253 * 3], 253, 1);
+
+	// Free any previous messages
+	scene._kernelMessages.reset();
+
+	// Handle the bars at the top/bottom
+	if (resEntry._showWhiteBars) {
+		// For animations the screen has been clipped to the middle 156 rows.
+		// So although it's slightly messy, bypass our screen class entirely,
+		// and draw the horizontal lines directly on the physiacl screen surface
+		Graphics::Surface *s = g_system->lockScreen();
+		s->hLine(0, 20, MADS_SCREEN_WIDTH, 253);
+		s->hLine(0, 179, MADS_SCREEN_WIDTH, 253);
+		g_system->unlockScreen();
+	}
+
+	// Load the new animation
+	delete _currentAnimation;
+	_currentAnimation = Animation::init(_vm, &scene);
+	int flags = ANIMFLAG_ANIMVIEW | (resEntry._bgFlag ? ANIMFLAG_LOAD_BACKGROUND : 0);
+	_currentAnimation->load(scene._backgroundSurface, scene._depthSurface, 
+		resEntry._resourceName, flags, &paletteCycles, _sceneInfo);
+
+	// Signal for a screen refresh
+	scene._spriteSlots.fullRefresh();
+
+	// If a sound driver has been specified, then load the correct one
+	if (!_currentAnimation->_header._soundName.empty()) {
+		const char *chP = strchr(_currentAnimation->_header._soundName.c_str(), '.');
+		assert(chP);
+
+		// Handle both Rex naming (xxx.009) and naming in later games (e.g. xxx.ph9)
+		int driverNum = atoi(chP + 3);
+		// HACK for Dragon
+		if (_currentAnimation->_header._soundName == "#SOUND.DRG")
+			driverNum = 9;
+		_vm->_sound->init(driverNum);
+	}
+
+	// Handle any manual setup
+	if (_currentAnimation->_header._manualFlag) {
+		_manualFrameNumber = _currentAnimation->_header._spritesIndex;
+		_manualSpriteSet = _currentAnimation->getSpriteSet(_manualFrameNumber);
+	}
+
+	// Set the sound data for the animation
+	_vm->_sound->setEnabled(resEntry._soundFlag);
+
+	Common::String dsrName = _currentAnimation->_header._dsrName;
+	if (!dsrName.empty())
+		_vm->_audio->setSoundGroup(dsrName);
+
+	// Start the new animation
+	_currentAnimation->startAnimation(0);
+
+	// Handle the palette and cycling palette
+	scene._cyclingActive = false;
+	Common::copy(&palette._mainPalette[0], &palette._mainPalette[PALETTE_SIZE],
+		&palette._cyclingPalette[0]);
+
+	_vm->_game->_fx = (ScreenTransition)resEntry._fx;
+	_nextCyclingActive = paletteCycles.size() > 0;
+	if (!_vm->_game->_fx) {
+		palette.setFullPalette(palette._mainPalette);
+	}
+
+	scene.initPaletteAnimation(paletteCycles, _nextCyclingActive && !_vm->_game->_fx);
+}
+
+void AnimationView::scriptDone() {
+	_breakFlag = true;
+	_vm->_dialogs->_pendingDialog = DIALOG_MAIN_MENU;
+}
+
+void AnimationView::processLines() {
+	if (_script.eos()) {
+		// end of script, end animation
+		scriptDone();
+		return;
+	}
+
+	while (!_script.eos()) {
+		// Get in next line
+		_currentLine.clear();
+		char c;
+		while (!_script.eos() && (c = _script.readByte()) != '\n') {
+			if (c != '\r' && c != '\0')
+				_currentLine += c;
+		}
+		
+		// Process the line
+		while (!_currentLine.empty()) {
+			if (_currentLine.hasPrefix("-")) {
+				_currentLine.deleteChar(0);
+
+				processCommand();
+			} else {
+				// Get resource name
+				Common::String resName;
+				while (!_currentLine.empty() && (c = _currentLine[0]) != ' ') {
+					_currentLine.deleteChar(0);
+					resName += c;
+				}
+
+				// Add resource into list along with any set state information
+				_resources.push_back(ResourceEntry(resName, _sfx, _soundFlag, 
+					_bgLoadFlag, _showWhiteBars));
+
+				// Fx resets between resource entries
+				_sfx = 0;
+			}
+
+			// Skip any spaces
+			while (_currentLine.hasPrefix(" "))
+				_currentLine.deleteChar(0);
+		}
+	}
+}
+
+void AnimationView::processCommand() {
+	// Get the command character
+	char commandChar = toupper(_currentLine[0]);
+	_currentLine.deleteChar(0);
+
+	// Handle the command
+	switch (commandChar) {
+	case 'B':
+		_soundFlag = !_soundFlag;
+		break;
+	case 'H':
+		// -h[:ex]  Disable EMS / XMS high memory support
+		if (_currentLine.hasPrefix(":"))
+			_currentLine.deleteChar(0);
+		while (_currentLine.hasPrefix("e") || _currentLine.hasPrefix("x"))
+			_currentLine.deleteChar(0);
+		break;
+	case 'O':
+		// -o:xxx  Specify opening special effect
+		assert(_currentLine[0] == ':');
+		_currentLine.deleteChar(0);
+		_sfx = getParameter();
+		break;
+	case 'P':
+		// Switch to CONCAT mode, which is ignored anyway
+		break;
+	case 'R': {
+		// Resynch timer (always, beginning, never)
+		assert(_currentLine[0] == ':');
+		_currentLine.deleteChar(0);
+
+		char v = toupper(_currentLine[0]);
+		_currentLine.deleteChar(0);
+		if (v == 'N')
+			_resyncMode = NEVER;
+		else if (v == 'A')
+			_resyncMode = ALWAYS;
+		else if (v == 'B')
+			_resyncMode = BEGINNING;
+		else
+			error("Unknown parameter");
+		break;
+	}
+	case 'W':
+		// Switch white bars being visible
+		_showWhiteBars = !_showWhiteBars;
+		break;
+	case 'X':
+		// Exit after animation finishes. Ignore
+		break;
+	case 'D':
+		// Unimplemented and ignored in the original. Ignore as well
+		break;
+	case 'Y':
+		// Reset palette on startup
+		_resetPalette = true;
+		break;
+	default:
+		error("Unknown command char: '%c'", commandChar);
+	}
+}
+
+int AnimationView::getParameter() {
+	int result = 0;
+
+	while (!_currentLine.empty()) {
+		char c = _currentLine[0];
+		
+		if (c >= '0' && c <= '9') {
+			_currentLine.deleteChar(0);
+			result = result * 10 + (c - '0');
+		} else {
+			break;
+		}
+	}
+
+	return result;
+}
+
+void AnimationView::checkResource(const Common::String &resourceName) {
+	//bool hasSuffix = false;
+	
+}
+
+int AnimationView::scanResourceIndex(const Common::String &resourceName) {
+	int foundIndex = -1;
+
+	if (_v1) {
+		const char *chP = strchr(resourceName.c_str(), '\\');
+		if (!chP) {
+			chP = strchr(resourceName.c_str(), '*');
+		}
+
+		Common::String resName = chP ? Common::String(chP + 1) : resourceName;
+
+		if (_v2 != 3) {
+			assert(_resIndex.size() == 0);
+		}
+
+		// Scan for the resource name
+		for (uint resIndex = 0; resIndex < _resIndex.size(); ++resIndex) {
+			ResIndexEntry &resEntry = _resIndex[resIndex];
+			if (resEntry._resourceName.compareToIgnoreCase(resourceName)) {
+				foundIndex = resIndex;
+				break;
+			}
+		}
+	}
+
+	if (foundIndex >= 0) {
+		// TODO
+	}
+	return -1;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/menu_views.h b/engines/mads/menu_views.h
new file mode 100644
index 0000000..6faa665
--- /dev/null
+++ b/engines/mads/menu_views.h
@@ -0,0 +1,226 @@
+/* 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 MADS_MENU_VIEWS_H
+#define MADS_MENU_VIEWS_H
+
+#include "common/scummsys.h"
+#include "mads/dialogs.h"
+#include "mads/game.h"
+#include "mads/msurface.h"
+
+namespace MADS {
+
+class MADSEngine;
+
+class MenuView: public FullScreenDialog {
+protected:
+	bool _breakFlag;
+	bool _redrawFlag;
+
+	virtual void doFrame() = 0;
+
+	virtual void display();
+
+	/**
+	* Event handler
+	*/
+	virtual bool onEvent(Common::Event &event);
+public:
+	MenuView(MADSEngine *vm);
+
+	virtual ~MenuView() {}
+
+	virtual void show();
+};
+
+struct TextLine {
+	Common::Point _pos;
+	Common::String _line;
+	int _textDisplayIndex;
+};
+
+/**
+ * Scrolling text view
+ */
+class TextView : public MenuView {
+private:
+	static char _resourceName[100];
+
+	bool _animating;
+	Common::Array<TextLine> _textLines;
+	Common::Point _pan;
+	int _panSpeed;
+	MSurface _spareScreens[4];
+	int _scrollCount;
+	int _lineY;
+	uint32 _scrollTimeout;
+	int _panCountdown;
+	int _translationX;
+	Common::File _script;
+	char _currentLine[80];
+	MSurface *_spareScreen;
+	Font *_font;
+private:
+	/**
+	 * Load the text resource
+	 */
+	void load();
+
+	/**
+	 * Process the lines
+	 */
+	void processLines();
+
+	/**
+	 * Process a command from the script file
+	 */
+	void processCommand();
+
+	/**
+	 * Process text from the script file
+	 */
+	void processText();
+
+	/**
+	 * Get a parameter from line
+	 */
+	int getParameter(const char **paramP);
+
+	/**
+	 * Called when the script is finished
+	 */
+	void scriptDone();
+
+	/**
+	 * Reset the game palette
+	 */
+	void resetPalette();
+protected:
+	virtual void display();
+
+	virtual void doFrame();
+public:
+	/**
+	 * Queue the given text resource for display
+	 */
+	static void execute(MADSEngine *vm, const Common::String &resName);
+
+	TextView(MADSEngine *vm);
+
+	virtual ~TextView();
+};
+
+enum ResyncMode { NEVER, ALWAYS, BEGINNING };
+
+struct ResourceEntry {
+	Common::String _resourceName;
+	int _fx;
+	bool _soundFlag;
+	bool _bgFlag;
+	bool _showWhiteBars;
+
+	ResourceEntry() {}
+	ResourceEntry(const Common::String &resName, int fx, bool soundFlag,
+			bool bgFlag, bool showWhiteBars) {
+		_resourceName = resName;
+		_fx = fx;
+		_soundFlag = soundFlag;
+		_bgFlag = bgFlag;
+		_showWhiteBars = showWhiteBars;
+	}
+};
+
+struct ResIndexEntry {
+	int _id;
+	int _v;
+	Common::String _resourceName;
+
+	ResIndexEntry() {}
+};
+
+/**
+* Animation cutscene view
+*/
+class AnimationView : public MenuView {
+private:
+	static char _resourceName[100];
+
+	Common::File _script;
+	uint32 _previousUpdate;
+	Common::String _currentLine;
+	bool _soundDriverLoaded;
+	bool _resetPalette;
+	ResyncMode _resyncMode;
+	int _sfx;
+	bool _soundFlag;
+	bool _bgLoadFlag;
+	bool _showWhiteBars;
+	Common::Array<ResourceEntry> _resources;
+	Common::Array<ResIndexEntry> _resIndex;
+	int _v1;
+	int _v2;
+	int _resourceIndex;
+	SceneInfo *_sceneInfo;
+	Animation *_currentAnimation;
+	int _manualFrameNumber;
+	SpriteAsset *_manualSpriteSet;
+	int _manualStartFrame, _manualEndFrame;
+	int _manualFrame2;
+	int _animFrameNumber;
+	bool _nextCyclingActive;
+private:
+	void checkResource(const Common::String &resourceName);
+
+	int scanResourceIndex(const Common::String &resourceName);
+
+	void load();
+
+	void processLines();
+
+	void processCommand();
+
+	int getParameter();
+
+	void scriptDone();
+
+	void loadNextResource();
+protected:
+	virtual void display();
+
+	virtual void doFrame();
+
+	virtual bool onEvent(Common::Event &event);
+public:
+	/**
+	* Queue the given text resource for display
+	*/
+	static void execute(MADSEngine *vm, const Common::String &resName);
+
+	AnimationView(MADSEngine *vm);
+
+	virtual ~AnimationView();
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_MENU_VIEWS_H */
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 8a792a7..7cb7a91 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -37,6 +37,7 @@ MODULE_OBJS := \
 	hotspots.o \
 	inventory.o \
 	mads.o \
+	menu_views.o \
 	messages.o \
 	msurface.o \
 	palette.o \
diff --git a/engines/mads/nebular/dialogs_nebular.cpp b/engines/mads/nebular/dialogs_nebular.cpp
index 35a7d3b..86244bd 100644
--- a/engines/mads/nebular/dialogs_nebular.cpp
+++ b/engines/mads/nebular/dialogs_nebular.cpp
@@ -553,67 +553,6 @@ void PictureDialog::restore() {
 
 /*------------------------------------------------------------------------*/
 
-FullScreenDialog::FullScreenDialog(MADSEngine *vm) : _vm(vm) {
-	_screenId = 990;
-	_palFlag = true;
-}
-
-FullScreenDialog::~FullScreenDialog() {
-	_vm->_screen.resetClipBounds();
-	_vm->_game->_scene.restrictScene();
-}
-
-void FullScreenDialog::display() {
-	Game &game = *_vm->_game;
-	Scene &scene = game._scene;
-
-	int nextSceneId = scene._nextSceneId;
-	int currentSceneId = scene._currentSceneId;
-	int priorSceneId = scene._priorSceneId;
-
-	if (_screenId > 0) {
-		SceneInfo *sceneInfo = SceneInfo::init(_vm);
-		sceneInfo->load(_screenId, 0, "", 0, scene._depthSurface, scene._backgroundSurface);
-	}
-
-	scene._priorSceneId = priorSceneId;
-	scene._currentSceneId = currentSceneId;
-	scene._nextSceneId = nextSceneId;
-
-	_vm->_events->initVars();
-	game._kernelMode = KERNEL_ROOM_INIT;
-
-	byte pal[768];
-	if (_vm->_screenFade) {
-		Common::fill(&pal[0], &pal[PALETTE_SIZE], 0);
-		_vm->_palette->setFullPalette(pal);
-	} else {
-		_vm->_palette->getFullPalette(pal);
-		_vm->_palette->fadeOut(pal, nullptr, 0, PALETTE_COUNT, 0, 1, 1, 16);
-	}
-
-	// Set Fx state and palette entries
-	game._fx = _vm->_screenFade == SCREEN_FADE_SMOOTH ? kTransitionFadeIn : kCenterVertTransition;
-	game._trigger = 0;
-
-	// Clear the screen and draw the upper and lower horizontal lines
-	_vm->_screen.empty();
-	_vm->_palette->setLowRange();
-	_vm->_screen.hLine(0, 20, MADS_SCREEN_WIDTH, 2);
-	_vm->_screen.hLine(0, 179, MADS_SCREEN_WIDTH, 2);
-	_vm->_screen.copyRectToScreen(Common::Rect(0, 0, MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT));
-
-	// Restrict the screen to the area between the two lines
-	_vm->_screen.setClipBounds(Common::Rect(0, DIALOG_TOP, MADS_SCREEN_WIDTH,
-		DIALOG_TOP + MADS_SCENE_HEIGHT));
-	_vm->_game->_scene.restrictScene();
-
-	if (_screenId > 0)
-		scene._spriteSlots.fullRefresh();
-}
-
-/*------------------------------------------------------------------------*/
-
 GameDialog::DialogLine::DialogLine() {
 	_active = true;
 	_state = DLGSTATE_UNSELECTED;
diff --git a/engines/mads/nebular/dialogs_nebular.h b/engines/mads/nebular/dialogs_nebular.h
index f64f992..d00cd87 100644
--- a/engines/mads/nebular/dialogs_nebular.h
+++ b/engines/mads/nebular/dialogs_nebular.h
@@ -31,8 +31,6 @@ namespace MADS {
 
 namespace Nebular {
 
-#define DIALOG_TOP 22
-
 enum CapitalizationMode { kUppercase = 0, kLowercase = 1, kUpperAndLower = 2 };
 
 class DialogsNebular : public Dialogs {
@@ -109,36 +107,6 @@ enum DialogTextAlign { ALIGN_NONE = 0, ALIGN_CENTER = -1, ALIGN_AT_CENTER = -2,
 
 enum DialogState { DLGSTATE_UNSELECTED = 0, DLGSTATE_SELECTED = 1, DLGSTATE_FOCUSED = 2 };
 
-class FullScreenDialog: public EventTarget {
-protected:
-	/**
-	 * Engine reference
-	 */
-	MADSEngine *_vm;
-
-	/**
-	 * Screen/scene to show background from
-	 */
-	int _screenId;
-
-	/**
-	 * Flag for palette initialization
-	 */
-	bool _palFlag;
-
-	/**
-	 * Handles displaying the screen background and dialog
-	 */
-	virtual void display();
-public:
-	/**
-	 * Constructor
-	 */
-	FullScreenDialog(MADSEngine *vm);
-
-	virtual ~FullScreenDialog();
-};
-
 class GameDialog: public FullScreenDialog {
 	struct DialogLine {
 		bool _active;
diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp
index 6a13cea..717e3f6 100644
--- a/engines/mads/nebular/menu_nebular.cpp
+++ b/engines/mads/nebular/menu_nebular.cpp
@@ -23,6 +23,7 @@
 #include "common/scummsys.h"
 #include "mads/game.h"
 #include "mads/mads.h"
+#include "mads/menu_views.h"
 #include "mads/resources.h"
 #include "mads/scene.h"
 #include "mads/screen.h"
@@ -36,58 +37,6 @@ namespace Nebular {
 #define MADS_MENU_Y ((MADS_SCREEN_HEIGHT - MADS_SCENE_HEIGHT) / 2)
 #define MADS_MENU_ANIM_DELAY 70
 
-MenuView::MenuView(MADSEngine *vm) : FullScreenDialog(vm) {
-	_breakFlag = false;
-	_redrawFlag = true;
-	_palFlag = false;
-}
-
-void MenuView::show() {
- 	Scene &scene = _vm->_game->_scene;	
-	EventsManager &events = *_vm->_events;
-	_vm->_screenFade = SCREEN_FADE_FAST;
-
-	scene._spriteSlots.reset(true);
-	display();
-
-	events.setEventTarget(this);
-	events.hideCursor();
-
-	while (!_breakFlag && !_vm->shouldQuit()) {
-		if (_redrawFlag) {
-			scene._kernelMessages.update();
-
-			_vm->_game->_scene.drawElements(_vm->_game->_fx, _vm->_game->_fx);
-			_redrawFlag = false;
-		}
-
-		_vm->_events->waitForNextFrame();
-		_vm->_game->_fx = kTransitionNone;
-		doFrame();
-	}
-
-	events.setEventTarget(nullptr);
-	_vm->_sound->stop();
-}
-
-void MenuView::display() {
-	_vm->_palette->resetGamePalette(4, 8);
-
-	FullScreenDialog::display();
-}
-
-bool MenuView::onEvent(Common::Event &event) {
-	if (event.type == Common::EVENT_KEYDOWN || event.type == Common::EVENT_LBUTTONDOWN) {
-		_breakFlag = true;
-		_vm->_dialogs->_pendingDialog = DIALOG_MAIN_MENU;
-		return true;
-	}
-
-	return false;
-}
-
-/*------------------------------------------------------------------------*/
-
 MainMenu::MainMenu(MADSEngine *vm): MenuView(vm) {
 	Common::fill(&_menuItems[0], &_menuItems[7], (SpriteAsset *)nullptr);
 	Common::fill(&_menuItemIndexes[0], &_menuItemIndexes[7], -1);
@@ -426,706 +375,6 @@ bool AdvertView::onEvent(Common::Event &event) {
 	return false;
 }
 
-/*------------------------------------------------------------------------*/
-
-char TextView::_resourceName[100];
-#define TEXTVIEW_LINE_SPACING 2
-#define TEXT_ANIMATION_DELAY 100
-#define TV_NUM_FADE_STEPS 40
-#define TV_FADE_DELAY_MILLI 50
-
-void TextView::execute(MADSEngine *vm, const Common::String &resName) {
-	assert(resName.size() < 100);
-	Common::strlcpy(_resourceName, resName.c_str(), sizeof(_resourceName));
-	vm->_dialogs->_pendingDialog = DIALOG_TEXTVIEW;
-}
-
-TextView::TextView(MADSEngine *vm) : MenuView(vm) {
-	_animating = false;
-	_panSpeed = 0;
-	_spareScreen = nullptr;
-	_scrollCount = 0;
-	_lineY = -1;
-	_scrollTimeout = 0;
-	_panCountdown = 0;
-	_translationX = 0;
-	_screenId = -1;
-
-	_font = _vm->_font->getFont(FONT_CONVERSATION);
-	_vm->_palette->resetGamePalette(4, 0);
-
-	load();
-}
-
-TextView::~TextView() {
-}
-
-void TextView::load() {
-	Common::String scriptName(_resourceName);
-	scriptName += ".txr";
-
-	if (!_script.open(scriptName))
-		error("Could not open resource %s", _resourceName);
-
-	processLines();
-}
-
-void TextView::processLines() {
-	if (_script.eos())
-		error("Attempted to read past end of response file");
-
-	while (!_script.eos()) {
-		// Read in the next line
-		_script.readLine(_currentLine, 79);
-		char *p = _currentLine + strlen(_currentLine) - 1;
-		if (*p == '\n')
-			*p = '\0';
-
-		// Commented out line, so go loop for another
-		if (_currentLine[0] == '#')
-			continue;
-
-		// Process the line
-		char *cStart = strchr(_currentLine, '[');
-		if (cStart) {
-			while (cStart) {
-				// Loop for possible multiple commands on one line
-				char *cEnd = strchr(_currentLine, ']');
-				if (!cEnd)
-					error("Unterminated command '%s' in response file", _currentLine);
-
-				*cEnd = '\0';
-				processCommand();
-
-				// Copy rest of line (if any) to start of buffer
-				Common::strlcpy(_currentLine, cEnd + 1, sizeof(_currentLine));
-
-				cStart = strchr(_currentLine, '[');
-			}
-
-			if (_currentLine[0]) {
-				processText();
-				break;
-			}
-
-		} else {
-			processText();
-			break;
-		}
-	}
-}
-
-void TextView::processCommand() {
-	Scene &scene = _vm->_game->_scene;
-	Common::String scriptLine(_currentLine + 1);
-	scriptLine.toUppercase();
-	const char *paramP;
-	const char *commandStr = scriptLine.c_str();
-
-	if (!strncmp(commandStr, "BACKGROUND", 10)) {
-		// Set the background
-		paramP = commandStr + 10;
-		resetPalette();
-		int screenId = getParameter(&paramP);
-		
-		SceneInfo *sceneInfo = SceneInfo::init(_vm);
-		sceneInfo->load(screenId, 0, "", 0, scene._depthSurface, scene._backgroundSurface);
-		scene._spriteSlots.fullRefresh();
-		_redrawFlag = true;
-
-	} else if (!strncmp(commandStr, "GO", 2)) {
-		_animating = true;
-
-	} else if (!strncmp(commandStr, "PAN", 3)) {
-		// Set panning values
-		paramP = commandStr + 3;
-		int panX = getParameter(&paramP);
-		int panY = getParameter(&paramP);
-		int panSpeed = getParameter(&paramP);
-
-		if ((panX != 0) || (panY != 0)) {
-			_pan = Common::Point(panX, panY);
-			_panSpeed = panSpeed;
-		}
-
-	} else if (!strncmp(commandStr, "DRIVER", 6)) {
-		// Set the driver to use
-		paramP = commandStr + 7;
-
-		if (!strncmp(paramP, "#SOUND.00", 9)) {
-			int driverNum = paramP[9] - '0';
-			_vm->_sound->init(driverNum);
-		}
-	} else if (!strncmp(commandStr, "SOUND", 5)) {
-		// Set sound number
-		paramP = commandStr + 5;
-		int soundId = getParameter(&paramP);
-		_vm->_sound->command(soundId);
-
-	} else if (!strncmp(commandStr, "COLOR", 5) && ((commandStr[5] == '0') || 
-			(commandStr[5] == '1'))) {
-		// Set the text colors
-		int index = commandStr[5] - '0';
-		paramP = commandStr + 6;
-
-		byte r = getParameter(&paramP);
-		byte g = getParameter(&paramP);
-		byte b = getParameter(&paramP);
-
-		_vm->_palette->setEntry(5 + index, r, g, b);
-
-	} else if (!strncmp(commandStr, "SPARE", 5)) {
-		// Sets a secondary background number that can be later switched in with a PAGE command
-		paramP = commandStr + 6;
-		int spareIndex = commandStr[5] - '0';
-		assert(spareIndex < 4);
-		int screenId = getParameter(&paramP);
-
-		// Load the spare background
-		SceneInfo *sceneInfo = SceneInfo::init(_vm);
-		sceneInfo->_width = MADS_SCREEN_WIDTH;
-		sceneInfo->_height = MADS_SCENE_HEIGHT;
-		_spareScreens[spareIndex].setSize(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
-		sceneInfo->loadMadsV1Background(screenId, "", SCENEFLAG_TRANSLATE, 
-			_spareScreens[spareIndex]);
-		delete sceneInfo;
-
-	} else if (!strncmp(commandStr, "PAGE", 4)) {
-		// Signals to change to a previous specified secondary background
-		paramP = commandStr + 4;
-		int spareIndex = getParameter(&paramP);
-
-		// Only allow background switches if one isn't currently in progress
-		if (!_spareScreen && _spareScreens[spareIndex].getPixels() != nullptr) {
-			_spareScreen = &_spareScreens[spareIndex];
-			_translationX = 0;
-		}
-
-	} else {
-		error("Unknown response command: '%s'", commandStr);
-	}
-}
-
-int TextView::getParameter(const char **paramP) {
-	if ((**paramP != '=') && (**paramP != ','))
-		return 0;
-
-	int result = 0;
-	++*paramP;
-	while ((**paramP >= '0') && (**paramP <= '9')) {
-		result = result * 10 + (**paramP - '0');
-		++*paramP;
-	}
-
-	return result;
-}
-
-void TextView::processText() {
-	int xStart;
-
-	if (!strcmp(_currentLine, "***")) {
-		// Special signifier for end of script
-		_scrollCount = _font->getHeight() * 13;
-		_lineY = -1;
-		return;
-	}
-
-	_lineY = 0;
-
-	// Lines are always centered, except if line contains a '@', in which case the
-	// '@' marks the position that must be horizontally centered
-	char *centerP = strchr(_currentLine, '@');
-	if (centerP) {
-		*centerP = '\0';
-		xStart = (MADS_SCREEN_WIDTH / 2) - _font->getWidth(_currentLine);
-
-		// Delete the @ character and shift back the remainder of the string
-		char *p = centerP + 1;
-		if (*p == ' ') ++p;
-		strcpy(centerP, p);
-
-	} else {
-		int lineWidth = _font->getWidth(_currentLine);
-		xStart = (MADS_SCREEN_WIDTH - lineWidth) / 2;
-	}
-
-	// Add the new line to the list of pending lines
-	TextLine tl;
-	tl._pos = Common::Point(xStart, MADS_SCENE_HEIGHT);
-	tl._line = _currentLine;
-	tl._textDisplayIndex = -1;
-	_textLines.push_back(tl);
-}
-
-void TextView::display() {
-	FullScreenDialog::display();
-}
-
-void TextView::resetPalette() {
-	_vm->_palette->resetGamePalette(8, 8);
-	_vm->_palette->setEntry(5, 0, 63, 63);
-	_vm->_palette->setEntry(6, 0, 45, 45);
-}
-
-void TextView::doFrame() {
-	Scene &scene = _vm->_game->_scene;
-	if (!_animating)
-		return;
-
-	// Only update state if wait period has expired
-	uint32 currTime = g_system->getMillis();
-
-	// If a screen transition is in progress and it's time for another column, handle it
-	if (_spareScreen) {
-		byte *srcP = _spareScreen->getBasePtr(_translationX, 0);
-		byte *bgP = scene._backgroundSurface.getBasePtr(_translationX, 0);
-		byte *screenP = (byte *)_vm->_screen.getBasePtr(_translationX, 0);
-
-		for (int y = 0; y < MADS_SCENE_HEIGHT; ++y, srcP += MADS_SCREEN_WIDTH,
-			bgP += MADS_SCREEN_WIDTH, screenP += MADS_SCREEN_WIDTH) {
-			*bgP = *srcP;
-			*screenP = *srcP;
-		}
-
-		// Flag the column of the screen is modified
-		_vm->_screen.copyRectToScreen(Common::Rect(_translationX, 0,
-			_translationX + 1, MADS_SCENE_HEIGHT));
-
-		// Keep moving the column to copy to the right
-		if (++_translationX == MADS_SCREEN_WIDTH) {
-			// Surface transition is complete
-			_spareScreen = nullptr;
-		}
-	}
-
-	// Make sure it's time for an update
-	if (currTime < _scrollTimeout)
-		return;
-	_scrollTimeout = g_system->getMillis() + TEXT_ANIMATION_DELAY;
-	_redrawFlag = true;
-
-	// If any panning values are set, pan the background surface
-	if ((_pan.x != 0) || (_pan.y != 0)) {
-		if (_panCountdown > 0) {
-			--_panCountdown;
-			return;
-		}
-
-		// Handle horizontal panning
-		if (_pan.x != 0) {
-			byte *lineTemp = new byte[_pan.x];
-			for (int y = 0; y < MADS_SCENE_HEIGHT; ++y) {
-				byte *pixelsP = (byte *)scene._backgroundSurface.getBasePtr(0, y);
-
-				// Copy the first X pixels into temp buffer, move the rest of the line
-				// to the start of the line, and then move temp buffer pixels to end of line
-				Common::copy(pixelsP, pixelsP + _pan.x, lineTemp);
-				Common::copy(pixelsP + _pan.x, pixelsP + MADS_SCREEN_WIDTH, pixelsP);
-				Common::copy(lineTemp, lineTemp + _pan.x, pixelsP + MADS_SCREEN_WIDTH - _pan.x);
-			}
-
-			delete[] lineTemp;
-		}
-
-		// Handle vertical panning
-		if (_pan.y != 0) {
-			// Store the bottom Y lines into a temp buffer, move the rest of the lines down,
-			// and then copy the stored lines back to the top of the screen
-			byte *linesTemp = new byte[_pan.y * MADS_SCREEN_WIDTH];
-			byte *pixelsP = (byte *)scene._backgroundSurface.getBasePtr(0, MADS_SCENE_HEIGHT - _pan.y);
-			Common::copy(pixelsP, pixelsP + MADS_SCREEN_WIDTH * _pan.y, linesTemp);
-
-			for (int y = MADS_SCENE_HEIGHT - 1; y >= _pan.y; --y) {
-				byte *destP = (byte *)scene._backgroundSurface.getBasePtr(0, y);
-				byte *srcP = (byte *)scene._backgroundSurface.getBasePtr(0, y - _pan.y);
-				Common::copy(srcP, srcP + MADS_SCREEN_WIDTH, destP);
-			}
-
-			Common::copy(linesTemp, linesTemp + _pan.y * MADS_SCREEN_WIDTH, 
-				(byte *)scene._backgroundSurface.getPixels());
-			delete[] linesTemp;
-		}
-
-		// Flag for a full screen refresh
-		scene._spriteSlots.fullRefresh();
-	}
-
-	// Scroll all active text lines up
-	for (int i = _textLines.size() - 1; i >= 0; --i) {
-		TextLine &tl = _textLines[i];
-		if (tl._textDisplayIndex != -1)
-			// Expire the text line that's already on-screen
-			scene._textDisplay.expire(tl._textDisplayIndex);
-
-		tl._pos.y--;
-		if (tl._pos.y < 0) {
-			_textLines.remove_at(i);
-		} else {
-			tl._textDisplayIndex = scene._textDisplay.add(tl._pos.x, tl._pos.y, 
-				0x605, -1, tl._line, _font);
-		}
-	}
-
-	if (_scrollCount > 0) {
-		// Handling final scrolling of text off of screen
-		if (--_scrollCount == 0) {
-			scriptDone();
-			return;
-		}
-	} else {
-		// Handling a text row
-		if (++_lineY == (_font->getHeight() + TEXTVIEW_LINE_SPACING))
-			processLines();
-	}
-}
-
-void TextView::scriptDone() {
-	_breakFlag = true;
-	_vm->_dialogs->_pendingDialog = DIALOG_MAIN_MENU;
-}
-
-/*------------------------------------------------------------------------*/
-
-char AnimationView::_resourceName[100];
-
-void AnimationView::execute(MADSEngine *vm, const Common::String &resName) {
-	assert(resName.size() < 100);
-	Common::strlcpy(_resourceName, resName.c_str(), sizeof(_resourceName));
-	vm->_dialogs->_pendingDialog = DIALOG_ANIMVIEW;
-}
-
-AnimationView::AnimationView(MADSEngine *vm) : MenuView(vm) {
-	_redrawFlag = false;
-
-	_soundDriverLoaded = false;
-	_previousUpdate = 0;
-	_screenId = -1;
-	_resetPalette = false;
-	_resyncMode = NEVER;
-	_v1 = 0;
-	_v2 = -1;
-	_resourceIndex = -1;
-	_currentAnimation = nullptr;
-	_sfx = 0;
-	_soundFlag = _bgLoadFlag = true;
-	_showWhiteBars = true;
-	_manualFrameNumber = 0;
-	_manualSpriteSet = nullptr;
-	_manualStartFrame = _manualEndFrame = 0;
-	_manualFrame2 = 0;
-	_animFrameNumber = 0;
-	_nextCyclingActive = false;
-	_sceneInfo = SceneInfo::init(_vm);
-
-	load();
-}
-
-AnimationView::~AnimationView() {
-	delete _currentAnimation;
-	delete _sceneInfo;
-}
-
-void AnimationView::load() {
-	Common::String resName(_resourceName);
-	if (!resName.hasSuffix("."))
-		resName += ".res";
-
-	if (!_script.open(resName))
-		error("Could not open resource %s", resName.c_str());
-
-	processLines();
-}
-
-void AnimationView::display() {
-	Scene &scene = _vm->_game->_scene;
-	_vm->_palette->initPalette();
-	Common::fill(&_vm->_palette->_cyclingPalette[0], &_vm->_palette->_cyclingPalette[PALETTE_SIZE], 0);
-
-	_vm->_palette->resetGamePalette(1, 8);
-	scene._spriteSlots.reset();
-	scene._paletteCycles.clear();
-
-	MenuView::display();
-}
-
-bool AnimationView::onEvent(Common::Event &event) {
-	// Wait for the Escape key or a mouse press
-	if (((event.type == Common::EVENT_KEYDOWN) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) ||
-			(event.type == Common::EVENT_RBUTTONUP)) {
-		scriptDone();
-		return true;
-	}
-
-	return false;
-}
-
-void AnimationView::doFrame() {
-	Scene &scene = _vm->_game->_scene;
-	
-	if (_resourceIndex == -1 || _currentAnimation->freeFlag()) {
-		if (++_resourceIndex == (int)_resources.size()) {
-			scriptDone();
-		} else {
-			scene._frameStartTime = 0;
-			loadNextResource();
-		}
-	} else if (_currentAnimation->getCurrentFrame() == 1) {
-		scene._cyclingActive = _nextCyclingActive;
-	}
-
-	if (_currentAnimation) {
-		++scene._frameStartTime;
-		_currentAnimation->update();
-		_redrawFlag = true;
-	}
-}
-
-void AnimationView::loadNextResource() {
-	Scene &scene = _vm->_game->_scene;
-	Palette &palette = *_vm->_palette;
-	ResourceEntry &resEntry = _resources[_resourceIndex];
-	Common::Array<PaletteCycle> paletteCycles;
-
-	if (resEntry._bgFlag)
-		palette.resetGamePalette(1, 8);
-
-	palette._mainPalette[253 * 3] = palette._mainPalette[253 * 3 + 1] 
-		= palette._mainPalette[253 * 3 + 2] = 0xb4;
-	palette.setPalette(&palette._mainPalette[253 * 3], 253, 1);
-
-	// Free any previous messages
-	scene._kernelMessages.reset();
-
-	// Handle the bars at the top/bottom
-	if (resEntry._showWhiteBars) {
-		// For animations the screen has been clipped to the middle 156 rows.
-		// So although it's slightly messy, bypass our screen class entirely,
-		// and draw the horizontal lines directly on the physiacl screen surface
-		Graphics::Surface *s = g_system->lockScreen();
-		s->hLine(0, 20, MADS_SCREEN_WIDTH, 253);
-		s->hLine(0, 179, MADS_SCREEN_WIDTH, 253);
-		g_system->unlockScreen();
-	}
-
-	// Load the new animation
-	delete _currentAnimation;
-	_currentAnimation = Animation::init(_vm, &scene);
-	int flags = ANIMFLAG_ANIMVIEW | (resEntry._bgFlag ? ANIMFLAG_LOAD_BACKGROUND : 0);
-	_currentAnimation->load(scene._backgroundSurface, scene._depthSurface, 
-		resEntry._resourceName, flags, &paletteCycles, _sceneInfo);
-
-	// Signal for a screen refresh
-	scene._spriteSlots.fullRefresh();
-
-	// If a sound driver has been specified, then load the correct one
-	if (!_currentAnimation->_header._soundName.empty()) {
-		const char *chP = strchr(_currentAnimation->_header._soundName.c_str(), '.');
-		assert(chP);
-
-		// Handle both Rex naming (xxx.009) and naming in later games (e.g. xxx.ph9)
-		int driverNum = atoi(chP + 3);
-		// HACK for Dragon
-		if (_currentAnimation->_header._soundName == "#SOUND.DRG")
-			driverNum = 9;
-		_vm->_sound->init(driverNum);
-	}
-
-	// Handle any manual setup
-	if (_currentAnimation->_header._manualFlag) {
-		_manualFrameNumber = _currentAnimation->_header._spritesIndex;
-		_manualSpriteSet = _currentAnimation->getSpriteSet(_manualFrameNumber);
-	}
-
-	// Set the sound data for the animation
-	_vm->_sound->setEnabled(resEntry._soundFlag);
-
-	Common::String dsrName = _currentAnimation->_header._dsrName;
-	if (!dsrName.empty())
-		_vm->_audio->setSoundGroup(dsrName);
-
-	// Start the new animation
-	_currentAnimation->startAnimation(0);
-
-	// Handle the palette and cycling palette
-	scene._cyclingActive = false;
-	Common::copy(&palette._mainPalette[0], &palette._mainPalette[PALETTE_SIZE],
-		&palette._cyclingPalette[0]);
-
-	_vm->_game->_fx = (ScreenTransition)resEntry._fx;
-	_nextCyclingActive = paletteCycles.size() > 0;
-	if (!_vm->_game->_fx) {
-		palette.setFullPalette(palette._mainPalette);
-	}
-
-	scene.initPaletteAnimation(paletteCycles, _nextCyclingActive && !_vm->_game->_fx);
-}
-
-void AnimationView::scriptDone() {
-	_breakFlag = true;
-	_vm->_dialogs->_pendingDialog = DIALOG_MAIN_MENU;
-}
-
-void AnimationView::processLines() {
-	if (_script.eos()) {
-		// end of script, end animation
-		scriptDone();
-		return;
-	}
-
-	while (!_script.eos()) {
-		// Get in next line
-		_currentLine.clear();
-		char c;
-		while (!_script.eos() && (c = _script.readByte()) != '\n') {
-			if (c != '\r' && c != '\0')
-				_currentLine += c;
-		}
-		
-		// Process the line
-		while (!_currentLine.empty()) {
-			if (_currentLine.hasPrefix("-")) {
-				_currentLine.deleteChar(0);
-
-				processCommand();
-			} else {
-				// Get resource name
-				Common::String resName;
-				while (!_currentLine.empty() && (c = _currentLine[0]) != ' ') {
-					_currentLine.deleteChar(0);
-					resName += c;
-				}
-
-				// Add resource into list along with any set state information
-				_resources.push_back(ResourceEntry(resName, _sfx, _soundFlag, 
-					_bgLoadFlag, _showWhiteBars));
-
-				// Fx resets between resource entries
-				_sfx = 0;
-			}
-
-			// Skip any spaces
-			while (_currentLine.hasPrefix(" "))
-				_currentLine.deleteChar(0);
-		}
-	}
-}
-
-void AnimationView::processCommand() {
-	// Get the command character
-	char commandChar = toupper(_currentLine[0]);
-	_currentLine.deleteChar(0);
-
-	// Handle the command
-	switch (commandChar) {
-	case 'B':
-		_soundFlag = !_soundFlag;
-		break;
-	case 'H':
-		// -h[:ex]  Disable EMS / XMS high memory support
-		if (_currentLine.hasPrefix(":"))
-			_currentLine.deleteChar(0);
-		while (_currentLine.hasPrefix("e") || _currentLine.hasPrefix("x"))
-			_currentLine.deleteChar(0);
-		break;
-	case 'O':
-		// -o:xxx  Specify opening special effect
-		assert(_currentLine[0] == ':');
-		_currentLine.deleteChar(0);
-		_sfx = getParameter();
-		break;
-	case 'P':
-		// Switch to CONCAT mode, which is ignored anyway
-		break;
-	case 'R': {
-		// Resynch timer (always, beginning, never)
-		assert(_currentLine[0] == ':');
-		_currentLine.deleteChar(0);
-
-		char v = toupper(_currentLine[0]);
-		_currentLine.deleteChar(0);
-		if (v == 'N')
-			_resyncMode = NEVER;
-		else if (v == 'A')
-			_resyncMode = ALWAYS;
-		else if (v == 'B')
-			_resyncMode = BEGINNING;
-		else
-			error("Unknown parameter");
-		break;
-	}
-	case 'W':
-		// Switch white bars being visible
-		_showWhiteBars = !_showWhiteBars;
-		break;
-	case 'X':
-		// Exit after animation finishes. Ignore
-		break;
-	case 'D':
-		// Unimplemented and ignored in the original. Ignore as well
-		break;
-	case 'Y':
-		// Reset palette on startup
-		_resetPalette = true;
-		break;
-	default:
-		error("Unknown command char: '%c'", commandChar);
-	}
-}
-
-int AnimationView::getParameter() {
-	int result = 0;
-
-	while (!_currentLine.empty()) {
-		char c = _currentLine[0];
-		
-		if (c >= '0' && c <= '9') {
-			_currentLine.deleteChar(0);
-			result = result * 10 + (c - '0');
-		} else {
-			break;
-		}
-	}
-
-	return result;
-}
-
-void AnimationView::checkResource(const Common::String &resourceName) {
-	//bool hasSuffix = false;
-	
-}
-
-int AnimationView::scanResourceIndex(const Common::String &resourceName) {
-	int foundIndex = -1;
-
-	if (_v1) {
-		const char *chP = strchr(resourceName.c_str(), '\\');
-		if (!chP) {
-			chP = strchr(resourceName.c_str(), '*');
-		}
-
-		Common::String resName = chP ? Common::String(chP + 1) : resourceName;
-
-		if (_v2 != 3) {
-			assert(_resIndex.size() == 0);
-		}
-
-		// Scan for the resource name
-		for (uint resIndex = 0; resIndex < _resIndex.size(); ++resIndex) {
-			ResIndexEntry &resEntry = _resIndex[resIndex];
-			if (resEntry._resourceName.compareToIgnoreCase(resourceName)) {
-				foundIndex = resIndex;
-				break;
-			}
-		}
-	}
-
-	if (foundIndex >= 0) {
-		// TODO
-	}
-	return -1;
-}
-
-
 } // End of namespace Nebular
 
 } // End of namespace MADS
diff --git a/engines/mads/nebular/menu_nebular.h b/engines/mads/nebular/menu_nebular.h
index c05c872..29777a7 100644
--- a/engines/mads/nebular/menu_nebular.h
+++ b/engines/mads/nebular/menu_nebular.h
@@ -25,6 +25,7 @@
 
 #include "common/scummsys.h"
 #include "mads/game.h"
+#include "mads/menu_views.h"
 #include "mads/msurface.h"
 #include "mads/nebular/dialogs_nebular.h"
 
@@ -36,27 +37,6 @@ namespace Nebular {
 
 enum MADSGameAction { START_GAME, RESUME_GAME, SHOW_INTRO, CREDITS, QUOTES, EXIT };
 
-class MenuView: public FullScreenDialog {
-protected:
-	bool _breakFlag;
-	bool _redrawFlag;
-
-	virtual void doFrame() = 0;
-
-	virtual void display();
-
-	/**
-	* Event handler
-	*/
-	virtual bool onEvent(Common::Event &event);
-public:
-	MenuView(MADSEngine *vm);
-
-	virtual ~MenuView() {}
-
-	virtual void show();
-};
-
 class MainMenu: public MenuView {
 private:
 	SpriteAsset *_menuItems[7];
@@ -148,174 +128,6 @@ public:
 	void show();
 };
 
-struct TextLine {
-	Common::Point _pos;
-	Common::String _line;
-	int _textDisplayIndex;
-};
-
-/**
- * Scrolling text view
- */
-class TextView : public MenuView {
-private:
-	static char _resourceName[100];
-
-	bool _animating;
-	Common::Array<TextLine> _textLines;
-	Common::Point _pan;
-	int _panSpeed;
-	MSurface _spareScreens[4];
-	int _scrollCount;
-	int _lineY;
-	uint32 _scrollTimeout;
-	int _panCountdown;
-	int _translationX;
-	Common::File _script;
-	char _currentLine[80];
-	MSurface *_spareScreen;
-	Font *_font;
-private:
-	/**
-	 * Load the text resource
-	 */
-	void load();
-
-	/**
-	 * Process the lines
-	 */
-	void processLines();
-
-	/**
-	 * Process a command from the script file
-	 */
-	void processCommand();
-
-	/**
-	 * Process text from the script file
-	 */
-	void processText();
-
-	/**
-	 * Get a parameter from line
-	 */
-	int getParameter(const char **paramP);
-
-	/**
-	 * Called when the script is finished
-	 */
-	void scriptDone();
-
-	/**
-	 * Reset the game palette
-	 */
-	void resetPalette();
-protected:
-	virtual void display();
-
-	virtual void doFrame();
-public:
-	/**
-	 * Queue the given text resource for display
-	 */
-	static void execute(MADSEngine *vm, const Common::String &resName);
-
-	TextView(MADSEngine *vm);
-
-	virtual ~TextView();
-};
-
-enum ResyncMode { NEVER, ALWAYS, BEGINNING };
-
-struct ResourceEntry {
-	Common::String _resourceName;
-	int _fx;
-	bool _soundFlag;
-	bool _bgFlag;
-	bool _showWhiteBars;
-
-	ResourceEntry() {}
-	ResourceEntry(const Common::String &resName, int fx, bool soundFlag,
-			bool bgFlag, bool showWhiteBars) {
-		_resourceName = resName;
-		_fx = fx;
-		_soundFlag = soundFlag;
-		_bgFlag = bgFlag;
-		_showWhiteBars = showWhiteBars;
-	}
-};
-
-struct ResIndexEntry {
-	int _id;
-	int _v;
-	Common::String _resourceName;
-
-	ResIndexEntry() {}
-};
-
-/**
-* Animation cutscene view
-*/
-class AnimationView : public MenuView {
-private:
-	static char _resourceName[100];
-
-	Common::File _script;
-	uint32 _previousUpdate;
-	Common::String _currentLine;
-	bool _soundDriverLoaded;
-	bool _resetPalette;
-	ResyncMode _resyncMode;
-	int _sfx;
-	bool _soundFlag;
-	bool _bgLoadFlag;
-	bool _showWhiteBars;
-	Common::Array<ResourceEntry> _resources;
-	Common::Array<ResIndexEntry> _resIndex;
-	int _v1;
-	int _v2;
-	int _resourceIndex;
-	SceneInfo *_sceneInfo;
-	Animation *_currentAnimation;
-	int _manualFrameNumber;
-	SpriteAsset *_manualSpriteSet;
-	int _manualStartFrame, _manualEndFrame;
-	int _manualFrame2;
-	int _animFrameNumber;
-	bool _nextCyclingActive;
-private:
-	void checkResource(const Common::String &resourceName);
-
-	int scanResourceIndex(const Common::String &resourceName);
-
-	void load();
-
-	void processLines();
-
-	void processCommand();
-
-	int getParameter();
-
-	void scriptDone();
-
-	void loadNextResource();
-protected:
-	virtual void display();
-
-	virtual void doFrame();
-
-	virtual bool onEvent(Common::Event &event);
-public:
-	/**
-	* Queue the given text resource for display
-	*/
-	static void execute(MADSEngine *vm, const Common::String &resName);
-
-	AnimationView(MADSEngine *vm);
-
-	virtual ~AnimationView();
-};
-
 } // End of namespace Nebular
 
 } // End of namespace MADS


Commit: e5296ebf8dd09f603499b1894a33865ec71bb28f
    https://github.com/scummvm/scummvm/commit/e5296ebf8dd09f603499b1894a33865ec71bb28f
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2015-05-31T14:45:10-04:00

Commit Message:
Merge branch 'master' into phantom

Changed paths:
  A CONTRIBUTING.md
  A audio/softsynth/mt32/Analog.cpp
  A audio/softsynth/mt32/Analog.h
  A audio/softsynth/mt32/MemoryRegion.h
  A audio/softsynth/mt32/MidiEventQueue.h
  A audio/softsynth/mt32/Types.h
  A audio/softsynth/mt32/internals.h
  A backends/platform/sdl/sdl-window.cpp
  A backends/platform/sdl/sdl-window.h
  A backends/platform/sdl/win32/win32-window.cpp
  A backends/platform/sdl/win32/win32-window.h
  A backends/platform/symbian/mmp/scummvm_access.mmp.in
  A backends/platform/symbian/mmp/scummvm_prince.mmp.in
  A dists/android/custom_rules.xml
  A dists/android/jni/Android.mk
  A dists/android/project.properties
  A dists/gcw0/default.gcw0.desktop
  A dists/gcw0/opk_make.sh
  A dists/gcw0/scummvm.png
  A dists/gcw0/scummvm.sh
  A dists/gcw0/scummvmrc
  A engines/access/access.cpp
  A engines/access/access.h
  A engines/access/amazon/amazon_game.cpp
  A engines/access/amazon/amazon_game.h
  A engines/access/amazon/amazon_logic.cpp
  A engines/access/amazon/amazon_logic.h
  A engines/access/amazon/amazon_player.cpp
  A engines/access/amazon/amazon_player.h
  A engines/access/amazon/amazon_resources.cpp
  A engines/access/amazon/amazon_resources.h
  A engines/access/amazon/amazon_room.cpp
  A engines/access/amazon/amazon_room.h
  A engines/access/amazon/amazon_scripts.cpp
  A engines/access/amazon/amazon_scripts.h
  A engines/access/animation.cpp
  A engines/access/animation.h
  A engines/access/asurface.cpp
  A engines/access/asurface.h
  A engines/access/bubble_box.cpp
  A engines/access/bubble_box.h
  A engines/access/char.cpp
  A engines/access/char.h
  A engines/access/configure.engine
  A engines/access/data.cpp
  A engines/access/data.h
  A engines/access/debugger.cpp
  A engines/access/debugger.h
  A engines/access/decompress.cpp
  A engines/access/decompress.h
  A engines/access/detection.cpp
  A engines/access/detection_tables.h
  A engines/access/events.cpp
  A engines/access/events.h
  A engines/access/files.cpp
  A engines/access/files.h
  A engines/access/font.cpp
  A engines/access/font.h
  A engines/access/inventory.cpp
  A engines/access/inventory.h
  A engines/access/martian/martian_game.cpp
  A engines/access/martian/martian_game.h
  A engines/access/martian/martian_resources.cpp
  A engines/access/martian/martian_resources.h
  A engines/access/martian/martian_room.cpp
  A engines/access/martian/martian_room.h
  A engines/access/martian/martian_scripts.cpp
  A engines/access/martian/martian_scripts.h
  A engines/access/module.mk
  A engines/access/player.cpp
  A engines/access/player.h
  A engines/access/resources.cpp
  A engines/access/resources.h
  A engines/access/room.cpp
  A engines/access/room.h
  A engines/access/screen.cpp
  A engines/access/screen.h
  A engines/access/scripts.cpp
  A engines/access/scripts.h
  A engines/access/sound.cpp
  A engines/access/sound.h
  A engines/access/video.cpp
  A engines/access/video.h
  A engines/sherlock/animation.cpp
  A engines/sherlock/animation.h
  A engines/sherlock/configure.engine
  A engines/sherlock/debugger.cpp
  A engines/sherlock/debugger.h
  A engines/sherlock/decompress.cpp
  A engines/sherlock/detection.cpp
  A engines/sherlock/detection_tables.h
  A engines/sherlock/events.cpp
  A engines/sherlock/events.h
  A engines/sherlock/inventory.cpp
  A engines/sherlock/inventory.h
  A engines/sherlock/journal.cpp
  A engines/sherlock/journal.h
  A engines/sherlock/map.cpp
  A engines/sherlock/map.h
  A engines/sherlock/module.mk
  A engines/sherlock/music.cpp
  A engines/sherlock/music.h
  A engines/sherlock/objects.cpp
  A engines/sherlock/objects.h
  A engines/sherlock/people.cpp
  A engines/sherlock/people.h
  A engines/sherlock/resources.cpp
  A engines/sherlock/resources.h
  A engines/sherlock/saveload.cpp
  A engines/sherlock/saveload.h
  A engines/sherlock/scalpel/darts.cpp
  A engines/sherlock/scalpel/darts.h
  A engines/sherlock/scalpel/drivers/adlib.cpp
  A engines/sherlock/scalpel/drivers/mididriver.h
  A engines/sherlock/scalpel/scalpel.cpp
  A engines/sherlock/scalpel/scalpel.h
  A engines/sherlock/scalpel/scalpel_scene.cpp
  A engines/sherlock/scalpel/scalpel_scene.h
  A engines/sherlock/scalpel/scalpel_user_interface.cpp
  A engines/sherlock/scalpel/scalpel_user_interface.h
  A engines/sherlock/scalpel/settings.cpp
  A engines/sherlock/scalpel/settings.h
  A engines/sherlock/scalpel/tsage/logo.cpp
  A engines/sherlock/scalpel/tsage/logo.h
  A engines/sherlock/scalpel/tsage/resources.cpp
  A engines/sherlock/scalpel/tsage/resources.h
  A engines/sherlock/scene.cpp
  A engines/sherlock/scene.h
  A engines/sherlock/screen.cpp
  A engines/sherlock/screen.h
  A engines/sherlock/sherlock.cpp
  A engines/sherlock/sherlock.h
  A engines/sherlock/sound.cpp
  A engines/sherlock/sound.h
  A engines/sherlock/surface.cpp
  A engines/sherlock/surface.h
  A engines/sherlock/talk.cpp
  A engines/sherlock/talk.h
  A engines/sherlock/tattoo/tattoo.cpp
  A engines/sherlock/tattoo/tattoo.h
  A engines/sherlock/tattoo/tattoo_scene.cpp
  A engines/sherlock/tattoo/tattoo_scene.h
  A engines/sherlock/tattoo/tattoo_user_interface.cpp
  A engines/sherlock/tattoo/tattoo_user_interface.h
  A engines/sherlock/user_interface.cpp
  A engines/sherlock/user_interface.h
  A engines/sword25/util/double_serialization.cpp
  A engines/sword25/util/double_serialization.h
  A engines/sword25/util/lua_persist.cpp
  A engines/sword25/util/lua_persistence.h
  A engines/sword25/util/lua_persistence_util.cpp
  A engines/sword25/util/lua_persistence_util.h
  A engines/sword25/util/lua_unpersist.cpp
  A engines/tsage/ringworld2/ringworld2_airduct.cpp
  A engines/tsage/ringworld2/ringworld2_airduct.h
  A engines/tsage/ringworld2/ringworld2_vampire.cpp
  A engines/tsage/ringworld2/ringworld2_vampire.h
  A engines/tsage/sherlock/sherlock_logo.cpp
  A engines/tsage/sherlock/sherlock_logo.h
  A engines/wintermute/game_description.h
  A engines/wintermute/video/subtitle_card.cpp
  A engines/wintermute/video/subtitle_card.h
  A engines/wintermute/video/video_subtitler.cpp
  A engines/wintermute/video/video_subtitler.h
  A engines/zvision/core/clock.cpp
  A engines/zvision/core/clock.h
  A engines/zvision/file/lzss_read_stream.cpp
  A engines/zvision/file/lzss_read_stream.h
  A engines/zvision/file/save_manager.cpp
  A engines/zvision/file/save_manager.h
  A engines/zvision/file/search_manager.cpp
  A engines/zvision/file/search_manager.h
  A engines/zvision/file/zfs_archive.cpp
  A engines/zvision/file/zfs_archive.h
  A engines/zvision/graphics/cursors/cursor.cpp
  A engines/zvision/graphics/cursors/cursor.h
  A engines/zvision/graphics/cursors/cursor_manager.cpp
  A engines/zvision/graphics/cursors/cursor_manager.h
  A engines/zvision/graphics/effects/fog.cpp
  A engines/zvision/graphics/effects/fog.h
  A engines/zvision/graphics/effects/light.cpp
  A engines/zvision/graphics/effects/light.h
  A engines/zvision/graphics/effects/wave.cpp
  A engines/zvision/graphics/effects/wave.h
  A engines/zvision/graphics/graphics_effect.h
  A engines/zvision/scripting/controls/fist_control.cpp
  A engines/zvision/scripting/controls/fist_control.h
  A engines/zvision/scripting/controls/hotmov_control.cpp
  A engines/zvision/scripting/controls/hotmov_control.h
  A engines/zvision/scripting/controls/paint_control.cpp
  A engines/zvision/scripting/controls/paint_control.h
  A engines/zvision/scripting/controls/safe_control.cpp
  A engines/zvision/scripting/controls/safe_control.h
  A engines/zvision/scripting/controls/save_control.cpp
  A engines/zvision/scripting/controls/save_control.h
  A engines/zvision/scripting/controls/slot_control.cpp
  A engines/zvision/scripting/controls/slot_control.h
  A engines/zvision/scripting/controls/titler_control.cpp
  A engines/zvision/scripting/controls/titler_control.h
  A engines/zvision/scripting/effects/animation_effect.cpp
  A engines/zvision/scripting/effects/animation_effect.h
  A engines/zvision/scripting/effects/distort_effect.cpp
  A engines/zvision/scripting/effects/distort_effect.h
  A engines/zvision/scripting/effects/music_effect.cpp
  A engines/zvision/scripting/effects/music_effect.h
  A engines/zvision/scripting/effects/region_effect.cpp
  A engines/zvision/scripting/effects/region_effect.h
  A engines/zvision/scripting/effects/syncsound_effect.cpp
  A engines/zvision/scripting/effects/syncsound_effect.h
  A engines/zvision/scripting/effects/timer_effect.cpp
  A engines/zvision/scripting/effects/timer_effect.h
  A engines/zvision/scripting/effects/ttytext_effect.cpp
  A engines/zvision/scripting/effects/ttytext_effect.h
  A engines/zvision/scripting/inventory.cpp
  A engines/zvision/scripting/menu.cpp
  A engines/zvision/scripting/menu.h
  A engines/zvision/scripting/scripting_effect.h
  A engines/zvision/sound/midi.cpp
  A engines/zvision/sound/midi.h
  A engines/zvision/text/string_manager.cpp
  A engines/zvision/text/string_manager.h
  A engines/zvision/text/subtitles.cpp
  A engines/zvision/text/subtitles.h
  A engines/zvision/text/text.cpp
  A engines/zvision/text/text.h
  A engines/zvision/text/truetype_font.cpp
  A engines/zvision/text/truetype_font.h
  A engines/zvision/video/rlf_decoder.cpp
  A engines/zvision/video/rlf_decoder.h
  A image/codecs/cinepak_tables.h
  A video/mpegps_decoder.cpp
  A video/mpegps_decoder.h
  R backends/platform/android/org/scummvm/scummvm/PluginProvider.java
  R backends/platform/android/org/scummvm/scummvm/ScummVMApplication.java
  R backends/platform/android/org/scummvm/scummvm/Unpacker.java
  R dists/android/mkplugin.sh
  R dists/android/plugin-manifest.xml
  R dists/android/plugin-manifest.xml.in
  R dists/android/plugin-strings.xml
  R dists/android/res/drawable/gradient.xml
  R dists/android/res/layout/splash.xml
  R dists/iphone/readme.txt
  R dists/iphone/scummvm.xcodeproj/project.pbxproj
  R engines/sword25/util/pluto/CHANGELOG
  R engines/sword25/util/pluto/FILEFORMAT
  R engines/sword25/util/pluto/README
  R engines/sword25/util/pluto/THANKS
  R engines/sword25/util/pluto/pdep.cpp
  R engines/sword25/util/pluto/pdep/README
  R engines/sword25/util/pluto/pdep/lzio.h
  R engines/sword25/util/pluto/pdep/pdep.h
  R engines/sword25/util/pluto/pluto.cpp
  R engines/sword25/util/pluto/pluto.h
  R engines/sword25/util/pluto/plzio.cpp
  R engines/zvision/animation/rlf_animation.cpp
  R engines/zvision/animation/rlf_animation.h
  R engines/zvision/archives/zfs_archive.cpp
  R engines/zvision/archives/zfs_archive.h
  R engines/zvision/core/menu.h
  R engines/zvision/core/save_manager.cpp
  R engines/zvision/core/save_manager.h
  R engines/zvision/cursors/cursor.cpp
  R engines/zvision/cursors/cursor.h
  R engines/zvision/cursors/cursor_manager.cpp
  R engines/zvision/cursors/cursor_manager.h
  R engines/zvision/fonts/truetype_font.cpp
  R engines/zvision/fonts/truetype_font.h
  R engines/zvision/inventory/inventory_manager.h
  R engines/zvision/scripting/controls/animation_control.cpp
  R engines/zvision/scripting/controls/animation_control.h
  R engines/zvision/scripting/controls/timer_node.cpp
  R engines/zvision/scripting/controls/timer_node.h
  R engines/zvision/strings/string_manager.cpp
  R engines/zvision/strings/string_manager.h
  R engines/zvision/subtitles/subtitles.h
  R engines/zvision/utility/clock.cpp
  R engines/zvision/utility/clock.h
  R engines/zvision/utility/lzss_read_stream.cpp
  R engines/zvision/utility/lzss_read_stream.h
  R engines/zvision/utility/single_value_container.cpp
  R engines/zvision/utility/single_value_container.h
  R engines/zvision/utility/utility.cpp
  R engines/zvision/utility/utility.h
    AUTHORS
    COPYRIGHT
    Makefile
    NEWS
    README
    audio/decoders/mp3.cpp
    audio/decoders/quicktime.cpp
    audio/fmopl.cpp
    audio/mods/protracker.cpp
    audio/softsynth/mt32/BReverbModel.cpp
    audio/softsynth/mt32/BReverbModel.h
    audio/softsynth/mt32/LA32FloatWaveGenerator.cpp
    audio/softsynth/mt32/LA32Ramp.cpp
    audio/softsynth/mt32/LA32WaveGenerator.cpp
    audio/softsynth/mt32/Part.cpp
    audio/softsynth/mt32/Partial.cpp
    audio/softsynth/mt32/PartialManager.cpp
    audio/softsynth/mt32/Poly.cpp
    audio/softsynth/mt32/Poly.h
    audio/softsynth/mt32/ROMInfo.cpp
    audio/softsynth/mt32/ROMInfo.h
    audio/softsynth/mt32/Structures.h
    audio/softsynth/mt32/Synth.cpp
    audio/softsynth/mt32/Synth.h
    audio/softsynth/mt32/TVA.cpp
    audio/softsynth/mt32/TVF.cpp
    audio/softsynth/mt32/TVP.cpp
    audio/softsynth/mt32/Tables.cpp
    audio/softsynth/mt32/Tables.h
    audio/softsynth/mt32/module.mk
    audio/softsynth/mt32/mt32emu.h
    audio/timestamp.cpp
    backends/audiocd/sdl/sdl-audiocd.cpp
    backends/audiocd/sdl/sdl-audiocd.h
    backends/events/dinguxsdl/dinguxsdl-events.cpp
    backends/events/sdl/sdl-events.cpp
    backends/events/sdl/sdl-events.h
    backends/events/symbiansdl/symbiansdl-events.cpp
    backends/fs/amigaos4/amigaos4-fs.cpp
    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/linuxmotosdl/linuxmotosdl-graphics.cpp
    backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
    backends/graphics/maemosdl/maemosdl-graphics.cpp
    backends/graphics/maemosdl/maemosdl-graphics.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.cpp
    backends/graphics/openpandora/op-graphics.h
    backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp
    backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h
    backends/graphics/sdl/sdl-graphics.cpp
    backends/graphics/sdl/sdl-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/keymapper/action.h
    backends/log/log.cpp
    backends/mixer/doublebuffersdl/doublebuffersdl-mixer.cpp
    backends/mixer/sdl/sdl-mixer.cpp
    backends/module.mk
    backends/platform/android/android.cpp
    backends/platform/android/android.h
    backends/platform/android/android.mk
    backends/platform/android/asset-archive.cpp
    backends/platform/android/jni.cpp
    backends/platform/android/jni.h
    backends/platform/android/org/scummvm/scummvm/ScummVM.java
    backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
    backends/platform/dingux/dingux.cpp
    backends/platform/dingux/dingux.mk
    backends/platform/gph/gph-backend.cpp
    backends/platform/linuxmoto/linuxmoto-sdl.cpp
    backends/platform/maemo/maemo.cpp
    backends/platform/maemo/maemo.h
    backends/platform/openpandora/op-backend.cpp
    backends/platform/samsungtv/samsungtv.cpp
    backends/platform/sdl/macosx/macosx.cpp
    backends/platform/sdl/macosx/macosx.h
    backends/platform/sdl/module.mk
    backends/platform/sdl/sdl-sys.h
    backends/platform/sdl/sdl.cpp
    backends/platform/sdl/sdl.h
    backends/platform/sdl/win32/win32-main.cpp
    backends/platform/sdl/win32/win32.cpp
    backends/platform/sdl/win32/win32.h
    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/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/help/ScummVM.rtf
    backends/platform/symbian/mmp/config.mmh
    backends/platform/symbian/mmp/scummvm_agi.mmp.in
    backends/platform/symbian/mmp/scummvm_agos.mmp.in
    backends/platform/symbian/mmp/scummvm_avalanche.mmp.in
    backends/platform/symbian/mmp/scummvm_base.mmp.in
    backends/platform/symbian/mmp/scummvm_bbvs.mmp.in
    backends/platform/symbian/mmp/scummvm_cge.mmp.in
    backends/platform/symbian/mmp/scummvm_cge2.mmp.in
    backends/platform/symbian/mmp/scummvm_cine.mmp.in
    backends/platform/symbian/mmp/scummvm_composer.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_dreamweb.mmp.in
    backends/platform/symbian/mmp/scummvm_fullpipe.mmp.in
    backends/platform/symbian/mmp/scummvm_gob.mmp.in
    backends/platform/symbian/mmp/scummvm_groovie.mmp.in
    backends/platform/symbian/mmp/scummvm_hopkins.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_mads.mmp.in
    backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
    backends/platform/symbian/mmp/scummvm_mortevielle.mmp.in
    backends/platform/symbian/mmp/scummvm_neverhood.mmp.in
    backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
    backends/platform/symbian/mmp/scummvm_pegasus.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_sword25.mmp.in
    backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
    backends/platform/symbian/mmp/scummvm_testbed.mmp.in
    backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
    backends/platform/symbian/mmp/scummvm_toltecs.mmp.in
    backends/platform/symbian/mmp/scummvm_tony.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/mmp/scummvm_voyeur.mmp.in
    backends/platform/symbian/mmp/scummvm_wintermute.mmp.in
    backends/platform/symbian/mmp/scummvm_zvision.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/symbian/src/SymbianOS.cpp
    backends/platform/symbian/src/SymbianOS.h
    backends/platform/wii/osystem_events.cpp
    backends/platform/wince/wince-sdl.cpp
    backends/taskbar/win32/win32-taskbar.cpp
    backends/taskbar/win32/win32-taskbar.h
    base/main.cpp
    base/version.cpp
    common/EventMapper.cpp
    common/c++11-compat.h
    common/endian.h
    common/fft.cpp
    common/fft.h
    common/scummsys.h
    common/stream.h
    common/unzip.cpp
    common/xmlparser.cpp
    config.guess
    config.sub
    configure
    devtools/create_project/create_project.cpp
    devtools/create_translations/po_parser.cpp
    devtools/credits.pl
    devtools/scumm-md5.txt
    dists/android/AndroidManifest.xml
    dists/android/AndroidManifest.xml.in
    dists/android/res/layout/main.xml
    dists/codeblocks/readme.txt
    dists/debian/copyright
    dists/macosx/Info.plist
    dists/macosx/Info.plist.in
    dists/scummvm.rc
    dists/scummvm.rc.in
    dists/win32/scummvm.nsi
    dists/win32/scummvm.nsi.in
    engines/agi/agi.cpp
    engines/agi/agi.h
    engines/agi/detection.cpp
    engines/agi/detection_tables.h
    engines/agi/font.h
    engines/agi/graphics.cpp
    engines/agi/graphics.h
    engines/agi/loader_v2.cpp
    engines/agi/loader_v3.cpp
    engines/agi/preagi.cpp
    engines/agi/preagi_mickey.cpp
    engines/agi/sound_pcjr.cpp
    engines/agi/text.cpp
    engines/agos/detection_tables.h
    engines/agos/gfx.cpp
    engines/agos/input.cpp
    engines/agos/midi.cpp
    engines/agos/midi.h
    engines/agos/rooms.cpp
    engines/agos/saveload.cpp
    engines/bbvs/bbvs.cpp
    engines/bbvs/bbvs.h
    engines/bbvs/detection.cpp
    engines/bbvs/dialogs.cpp
    engines/bbvs/dialogs.h
    engines/bbvs/gamemodule.cpp
    engines/bbvs/gamemodule.h
    engines/bbvs/graphics.cpp
    engines/bbvs/minigames/bbairguitar.cpp
    engines/bbvs/minigames/bbairguitar.h
    engines/bbvs/minigames/bbant.cpp
    engines/bbvs/minigames/bbant.h
    engines/bbvs/minigames/bbloogie.cpp
    engines/bbvs/minigames/bbloogie.h
    engines/bbvs/minigames/bbtennis.cpp
    engines/bbvs/minigames/bbtennis.h
    engines/bbvs/minigames/minigame.cpp
    engines/bbvs/minigames/minigame.h
    engines/bbvs/saveload.cpp
    engines/bbvs/scene.cpp
    engines/bbvs/spritemodule.cpp
    engines/bbvs/videoplayer.cpp
    engines/bbvs/walk.cpp
    engines/cge/vga13h.cpp
    engines/cge2/cge2.cpp
    engines/cge2/cge2.h
    engines/cge2/cge2_main.cpp
    engines/cge2/cge2_main.h
    engines/cge2/configure.engine
    engines/cge2/detection.cpp
    engines/cge2/events.cpp
    engines/cge2/hero.cpp
    engines/cge2/map.cpp
    engines/cge2/saveload.cpp
    engines/cge2/snail.cpp
    engines/cge2/spare.h
    engines/cge2/talk.cpp
    engines/cge2/vga13h.cpp
    engines/cine/detection_tables.h
    engines/drascula/actors.cpp
    engines/drascula/detection.cpp
    engines/drascula/talk.cpp
    engines/engine.cpp
    engines/engine.h
    engines/fullpipe/fullpipe.cpp
    engines/fullpipe/gameloader.cpp
    engines/fullpipe/gfx.cpp
    engines/fullpipe/input.cpp
    engines/fullpipe/inventory.cpp
    engines/fullpipe/mgm.cpp
    engines/fullpipe/modal.cpp
    engines/fullpipe/motion.cpp
    engines/fullpipe/scene.cpp
    engines/fullpipe/scenes/scene02.cpp
    engines/fullpipe/scenes/scene04.cpp
    engines/fullpipe/scenes/scene14.cpp
    engines/fullpipe/scenes/scene15.cpp
    engines/fullpipe/scenes/scene16.cpp
    engines/fullpipe/scenes/scene23.cpp
    engines/fullpipe/scenes/scene28.cpp
    engines/fullpipe/scenes/scene29.cpp
    engines/fullpipe/scenes/scene37.cpp
    engines/fullpipe/sound.cpp
    engines/fullpipe/statics.cpp
    engines/gob/inter_v1.cpp
    engines/gob/surface.cpp
    engines/gob/surface.h
    engines/groovie/graphics.cpp
    engines/groovie/graphics.h
    engines/groovie/roq.cpp
    engines/groovie/roq.h
    engines/groovie/script.cpp
    engines/groovie/script.h
    engines/hopkins/computer.cpp
    engines/hopkins/files.cpp
    engines/hopkins/lines.cpp
    engines/hopkins/sound.cpp
    engines/hopkins/sound.h
    engines/hopkins/talk.cpp
    engines/hugo/mouse.cpp
    engines/kyra/sound_adlib.cpp
    engines/kyra/vqa.cpp
    engines/made/database.cpp
    engines/made/pmvplayer.cpp
    engines/made/redreader.cpp
    engines/made/resource.cpp
    engines/made/screenfx.cpp
    engines/made/screenfx.h
    engines/made/script.cpp
    engines/made/script.h
    engines/made/scriptfuncs.cpp
    engines/mads/action.cpp
    engines/mads/action.h
    engines/mads/animation.cpp
    engines/mads/animation.h
    engines/mads/assets.cpp
    engines/mads/assets.h
    engines/mads/audio.cpp
    engines/mads/audio.h
    engines/mads/compression.cpp
    engines/mads/compression.h
    engines/mads/debugger.cpp
    engines/mads/debugger.h
    engines/mads/detection.cpp
    engines/mads/detection_tables.h
    engines/mads/dialogs.cpp
    engines/mads/dialogs.h
    engines/mads/dragonsphere/dragonsphere_scenes.cpp
    engines/mads/dragonsphere/dragonsphere_scenes.h
    engines/mads/dragonsphere/game_dragonsphere.cpp
    engines/mads/dragonsphere/game_dragonsphere.h
    engines/mads/events.cpp
    engines/mads/events.h
    engines/mads/font.cpp
    engines/mads/font.h
    engines/mads/game.cpp
    engines/mads/game.h
    engines/mads/game_data.cpp
    engines/mads/game_data.h
    engines/mads/globals.cpp
    engines/mads/globals.h
    engines/mads/hotspots.cpp
    engines/mads/hotspots.h
    engines/mads/inventory.cpp
    engines/mads/inventory.h
    engines/mads/mads.cpp
    engines/mads/mads.h
    engines/mads/menu_views.cpp
    engines/mads/menu_views.h
    engines/mads/messages.cpp
    engines/mads/messages.h
    engines/mads/msurface.cpp
    engines/mads/msurface.h
    engines/mads/nebular/dialogs_nebular.cpp
    engines/mads/nebular/dialogs_nebular.h
    engines/mads/nebular/game_nebular.cpp
    engines/mads/nebular/game_nebular.h
    engines/mads/nebular/globals_nebular.cpp
    engines/mads/nebular/globals_nebular.h
    engines/mads/nebular/menu_nebular.cpp
    engines/mads/nebular/menu_nebular.h
    engines/mads/nebular/nebular_scenes.cpp
    engines/mads/nebular/nebular_scenes.h
    engines/mads/nebular/nebular_scenes1.cpp
    engines/mads/nebular/nebular_scenes1.h
    engines/mads/nebular/nebular_scenes2.cpp
    engines/mads/nebular/nebular_scenes2.h
    engines/mads/nebular/nebular_scenes3.cpp
    engines/mads/nebular/nebular_scenes3.h
    engines/mads/nebular/nebular_scenes4.cpp
    engines/mads/nebular/nebular_scenes4.h
    engines/mads/nebular/nebular_scenes5.cpp
    engines/mads/nebular/nebular_scenes5.h
    engines/mads/nebular/nebular_scenes6.cpp
    engines/mads/nebular/nebular_scenes6.h
    engines/mads/nebular/nebular_scenes7.cpp
    engines/mads/nebular/nebular_scenes7.h
    engines/mads/nebular/nebular_scenes8.cpp
    engines/mads/nebular/nebular_scenes8.h
    engines/mads/nebular/sound_nebular.cpp
    engines/mads/nebular/sound_nebular.h
    engines/mads/palette.cpp
    engines/mads/palette.h
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/player.cpp
    engines/mads/player.h
    engines/mads/rails.cpp
    engines/mads/rails.h
    engines/mads/resources.cpp
    engines/mads/resources.h
    engines/mads/scene.cpp
    engines/mads/scene.h
    engines/mads/scene_data.cpp
    engines/mads/scene_data.h
    engines/mads/screen.cpp
    engines/mads/screen.h
    engines/mads/sequence.cpp
    engines/mads/sequence.h
    engines/mads/sound.cpp
    engines/mads/sound.h
    engines/mads/sprites.cpp
    engines/mads/sprites.h
    engines/mads/staticres.cpp
    engines/mads/staticres.h
    engines/mads/user_interface.cpp
    engines/mads/user_interface.h
    engines/mohawk/configure.engine
    engines/mohawk/cursors.cpp
    engines/mohawk/myst.cpp
    engines/mohawk/myst_graphics.cpp
    engines/mohawk/myst_graphics.h
    engines/mohawk/myst_stacks/myst.cpp
    engines/mohawk/riven_external.cpp
    engines/mohawk/video.cpp
    engines/mohawk/video.h
    engines/mortevielle/actions.cpp
    engines/mortevielle/detection_tables.h
    engines/mortevielle/dialogs.cpp
    engines/mortevielle/graphics.cpp
    engines/mortevielle/mortevielle.h
    engines/mortevielle/outtext.cpp
    engines/mortevielle/utils.cpp
    engines/neverhood/console.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/modules/module2400.cpp
    engines/neverhood/modules/module2700_sprites.cpp
    engines/neverhood/modules/module2800.cpp
    engines/neverhood/modules/module2800_sprites.cpp
    engines/neverhood/modules/module3000.cpp
    engines/neverhood/modules/module3000_sprites.cpp
    engines/neverhood/sound.cpp
    engines/pegasus/input.cpp
    engines/pegasus/menu.cpp
    engines/pegasus/pegasus.cpp
    engines/prince/animation.cpp
    engines/prince/animation.h
    engines/prince/archive.cpp
    engines/prince/archive.h
    engines/prince/cursor.h
    engines/prince/detection.cpp
    engines/prince/detection.h
    engines/prince/graphics.cpp
    engines/prince/graphics.h
    engines/prince/hero.cpp
    engines/prince/hero.h
    engines/prince/mhwanh.cpp
    engines/prince/mob.h
    engines/prince/object.cpp
    engines/prince/object.h
    engines/prince/prince.cpp
    engines/prince/prince.h
    engines/prince/pscr.h
    engines/prince/resource.h
    engines/prince/saveload.cpp
    engines/prince/script.cpp
    engines/prince/script.h
    engines/queen/logic.cpp
    engines/queen/talk.cpp
    engines/queen/walk.cpp
    engines/saga/actor.h
    engines/saga/introproc_ite.cpp
    engines/saga/saveload.cpp
    engines/saga/scene.cpp
    engines/saga/scene.h
    engines/saga/sfuncs.cpp
    engines/sci/console.cpp
    engines/sci/console.h
    engines/sci/detection.cpp
    engines/sci/detection_tables.h
    engines/sci/engine/file.cpp
    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/kmovement.cpp
    engines/sci/engine/kparse.cpp
    engines/sci/engine/kstring.cpp
    engines/sci/engine/kvideo.cpp
    engines/sci/engine/savegame.cpp
    engines/sci/engine/savegame.h
    engines/sci/engine/script.cpp
    engines/sci/engine/script.h
    engines/sci/engine/script_patches.cpp
    engines/sci/engine/script_patches.h
    engines/sci/engine/state.cpp
    engines/sci/engine/state.h
    engines/sci/engine/vm.cpp
    engines/sci/engine/workarounds.cpp
    engines/sci/engine/workarounds.h
    engines/sci/event.cpp
    engines/sci/graphics/controls16.cpp
    engines/sci/graphics/controls16.h
    engines/sci/graphics/cursor.cpp
    engines/sci/graphics/font.cpp
    engines/sci/graphics/font.h
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/paint16.cpp
    engines/sci/graphics/paint16.h
    engines/sci/graphics/paint32.cpp
    engines/sci/graphics/palette.cpp
    engines/sci/graphics/palette.h
    engines/sci/graphics/picture.cpp
    engines/sci/graphics/portrait.cpp
    engines/sci/graphics/portrait.h
    engines/sci/graphics/ports.cpp
    engines/sci/graphics/screen.cpp
    engines/sci/graphics/screen.h
    engines/sci/graphics/text16.cpp
    engines/sci/graphics/text16.h
    engines/sci/graphics/transitions.cpp
    engines/sci/graphics/view.cpp
    engines/sci/module.mk
    engines/sci/parser/vocabulary.cpp
    engines/sci/parser/vocabulary.h
    engines/sci/resource.cpp
    engines/sci/resource.h
    engines/sci/resource_audio.cpp
    engines/sci/sci.cpp
    engines/sci/sci.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/cdda.cpp
    engines/scumm/debugger.cpp
    engines/scumm/detection.cpp
    engines/scumm/detection_tables.h
    engines/scumm/dialogs.cpp
    engines/scumm/file.cpp
    engines/scumm/help.cpp
    engines/scumm/input.cpp
    engines/scumm/resource_v2.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_v5.cpp
    engines/scumm/script_v6.cpp
    engines/scumm/scumm-md5.h
    engines/scumm/scumm.cpp
    engines/scumm/scumm.h
    engines/scumm/scumm_v0.h
    engines/scumm/smush/smush_player.cpp
    engines/scumm/sound.cpp
    engines/scumm/vars.cpp
    engines/scumm/verbs.cpp
    engines/sword1/console.cpp
    engines/sword1/sound.cpp
    engines/sword25/gfx/renderobjectmanager.cpp
    engines/sword25/kernel/outputpersistenceblock.cpp
    engines/sword25/kernel/outputpersistenceblock.h
    engines/sword25/module.mk
    engines/sword25/script/luascript.cpp
    engines/sword25/sword25.cpp
    engines/sword25/util/lua/lapi.cpp
    engines/sword25/util/lua/liolib.cpp
    engines/tinsel/tinsel.cpp
    engines/tony/game.cpp
    engines/tony/gfxcore.cpp
    engines/tony/mpal/lzo.cpp
    engines/tony/mpal/mpal.cpp
    engines/tony/window.cpp
    engines/toon/anim.cpp
    engines/toon/character.cpp
    engines/toon/font.cpp
    engines/toon/state.cpp
    engines/toon/toon.cpp
    engines/toon/toon.h
    engines/tsage/blue_force/blueforce_scenes8.cpp
    engines/tsage/blue_force/blueforce_scenes8.h
    engines/tsage/blue_force/blueforce_scenes9.cpp
    engines/tsage/core.cpp
    engines/tsage/detection.cpp
    engines/tsage/detection_tables.h
    engines/tsage/globals.cpp
    engines/tsage/graphics.cpp
    engines/tsage/graphics.h
    engines/tsage/module.mk
    engines/tsage/resources.h
    engines/tsage/ringworld/ringworld_scenes3.cpp
    engines/tsage/ringworld/ringworld_scenes3.h
    engines/tsage/ringworld2/ringworld2_logic.cpp
    engines/tsage/ringworld2/ringworld2_outpost.cpp
    engines/tsage/ringworld2/ringworld2_outpost.h
    engines/tsage/ringworld2/ringworld2_scenes0.cpp
    engines/tsage/ringworld2/ringworld2_scenes1.cpp
    engines/tsage/ringworld2/ringworld2_scenes1.h
    engines/tsage/ringworld2/ringworld2_scenes3.cpp
    engines/tsage/tsage.cpp
    engines/tsage/tsage.h
    engines/voyeur/events.cpp
    engines/voyeur/files_threads.cpp
    engines/wintermute/base/base_engine.cpp
    engines/wintermute/base/base_engine.h
    engines/wintermute/base/base_file_manager.cpp
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/base_game.h
    engines/wintermute/base/base_game_settings.cpp
    engines/wintermute/base/base_game_settings.h
    engines/wintermute/base/base_keyboard_state.cpp
    engines/wintermute/base/base_keyboard_state.h
    engines/wintermute/base/base_sprite.cpp
    engines/wintermute/base/base_string_table.cpp
    engines/wintermute/base/base_string_table.h
    engines/wintermute/debugger.cpp
    engines/wintermute/detection.cpp
    engines/wintermute/detection_tables.h
    engines/wintermute/math/rect32.h
    engines/wintermute/module.mk
    engines/wintermute/video/video_theora_player.cpp
    engines/wintermute/video/video_theora_player.h
    engines/wintermute/wintermute.cpp
    engines/wintermute/wintermute.h
    engines/zvision/configure.engine
    engines/zvision/core/console.cpp
    engines/zvision/core/console.h
    engines/zvision/core/events.cpp
    engines/zvision/detection.cpp
    engines/zvision/detection.h
    engines/zvision/graphics/render_manager.cpp
    engines/zvision/graphics/render_manager.h
    engines/zvision/graphics/render_table.cpp
    engines/zvision/graphics/render_table.h
    engines/zvision/module.mk
    engines/zvision/scripting/actions.cpp
    engines/zvision/scripting/actions.h
    engines/zvision/scripting/control.cpp
    engines/zvision/scripting/control.h
    engines/zvision/scripting/controls/input_control.cpp
    engines/zvision/scripting/controls/input_control.h
    engines/zvision/scripting/controls/lever_control.cpp
    engines/zvision/scripting/controls/lever_control.h
    engines/zvision/scripting/controls/push_toggle_control.cpp
    engines/zvision/scripting/controls/push_toggle_control.h
    engines/zvision/scripting/puzzle.h
    engines/zvision/scripting/scr_file_handling.cpp
    engines/zvision/scripting/script_manager.cpp
    engines/zvision/scripting/script_manager.h
    engines/zvision/sound/zork_raw.cpp
    engines/zvision/sound/zork_raw.h
    engines/zvision/video/video.cpp
    engines/zvision/video/zork_avi_decoder.cpp
    engines/zvision/video/zork_avi_decoder.h
    engines/zvision/zvision.cpp
    engines/zvision/zvision.h
    graphics/VectorRenderer.h
    graphics/VectorRendererSpec.cpp
    graphics/VectorRendererSpec.h
    graphics/fonts/ttf.cpp
    graphics/surface.h
    graphics/transform_struct.h
    graphics/transform_tools.h
    gui/EventRecorder.cpp
    gui/Tooltip.cpp
    gui/Tooltip.h
    gui/about.cpp
    gui/browser_osx.mm
    gui/credits.h
    gui/debugger.cpp
    gui/debugger.h
    gui/dialog.cpp
    gui/saveload-dialog.cpp
    gui/themes/scummmodern.zip
    gui/themes/scummmodern/scummmodern_layout.stx
    gui/themes/translations.dat
    gui/widgets/edittext.cpp
    gui/widgets/tab.h
    icons/scummvm.info
    icons/scummvm_drawer.info
    image/codecs/cinepak.cpp
    image/codecs/cinepak.h
    image/codecs/codec.cpp
    image/codecs/codec.h
    image/codecs/mjpeg.cpp
    image/codecs/mpeg.h
    image/codecs/qtrle.cpp
    image/codecs/qtrle.h
    image/codecs/rpza.cpp
    image/codecs/rpza.h
    image/iff.cpp
    image/image_decoder.h
    po/be_BY.po
    po/ca_ES.po
    po/cs_CZ.po
    po/da_DA.po
    po/de_DE.po
    po/es_ES.po
    po/eu.po
    po/fi_FI.po
    po/fr_FR.po
    po/gl_ES.po
    po/hu_HU.po
    po/it_IT.po
    po/nb_NO.po
    po/nl_NL.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/timestamp.h
    test/common/endian.h
    test/common/memoryreadstream.h
    test/common/memoryreadstreamendian.h
    test/cxxtest/cxxtestgen.py
    video/avi_decoder.cpp
    video/avi_decoder.h
    video/module.mk
    video/qt_decoder.cpp
    video/qt_decoder.h
    video/theora_decoder.cpp
    video/theora_decoder.h
    video/video_decoder.cpp
    video/video_decoder.h



diff --cc engines/mads/menu_views.cpp
index 6acf6cd,cfc3b09..10d5a21
--- a/engines/mads/menu_views.cpp
+++ b/engines/mads/menu_views.cpp
@@@ -1,24 -1,24 +1,24 @@@
  /* 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.
-- *
-  */
 - * 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.
 - *
 - */
++*
++* 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/scummsys.h"
  #include "mads/game.h"
@@@ -240,7 -254,7 +254,8 @@@ void TextView::processCommand() 
  		sceneInfo->_width = MADS_SCREEN_WIDTH;
  		sceneInfo->_height = MADS_SCENE_HEIGHT;
  		_spareScreens[spareIndex].setSize(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
- 		sceneInfo->loadMadsV1Background(screenId, "", SCENEFLAG_TRANSLATE, 
++
+ 		sceneInfo->loadMadsV1Background(screenId, "", SCENEFLAG_TRANSLATE,
  			_spareScreens[spareIndex]);
  		delete sceneInfo;
  
diff --cc engines/mads/menu_views.h
index 6faa665,6c8a2a8..c203248
--- a/engines/mads/menu_views.h
+++ b/engines/mads/menu_views.h
@@@ -8,12 -8,12 +8,20 @@@
   * 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.
++<<<<<<< HEAD
 +
++=======
+  *
++>>>>>>> master
   * 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.
++<<<<<<< HEAD
 +
++=======
+  *
++>>>>>>> master
   * 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.
@@@ -119,6 -117,11 +125,11 @@@ protected
  	virtual void display();
  
  	virtual void doFrame();
+ 
+ 	/**
 -	* Called when the script is finished
 -	*/
++	 * Called when the script is finished
++	 */
+ 	virtual void scriptDone();
  public:
  	/**
  	 * Queue the given text resource for display
@@@ -188,11 -191,8 +199,13 @@@ private
  	int _manualFrame2;
  	int _animFrameNumber;
  	bool _nextCyclingActive;
 +private:
 +	void checkResource(const Common::String &resourceName);
 +
 +	int scanResourceIndex(const Common::String &resourceName);
 +
+ 	uint _scrollFrameCtr;
+ private:
  	void load();
  
  	void processLines();


Commit: 2356501d349098b9e408662155da490b176764d6
    https://github.com/scummvm/scummvm/commit/2356501d349098b9e408662155da490b176764d6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2015-08-30T19:36:40-04:00

Commit Message:
Merge branch 'master' into phantom

Conflicts:
	engines/mads/phantom/game_phantom.cpp
	engines/mads/phantom/globals_phantom.h
	engines/mads/phantom/phantom_scenes.h
	engines/mads/phantom/phantom_scenes1.cpp
	engines/mads/phantom/phantom_scenes1.h
	engines/sherlock/events.cpp
	engines/sherlock/inventory.cpp
	engines/sherlock/journal.cpp
	engines/sherlock/map.cpp
	engines/sherlock/map.h
	engines/sherlock/module.mk
	engines/sherlock/music.cpp
	engines/sherlock/music.h
	engines/sherlock/objects.cpp
	engines/sherlock/objects.h
	engines/sherlock/people.cpp
	engines/sherlock/people.h
	engines/sherlock/resources.cpp
	engines/sherlock/resources.h
	engines/sherlock/scalpel/drivers/adlib.cpp
	engines/sherlock/scalpel/drivers/mididriver.h
	engines/sherlock/scalpel/scalpel.cpp
	engines/sherlock/scalpel/scalpel_scene.cpp
	engines/sherlock/scalpel/scalpel_scene.h
	engines/sherlock/scalpel/scalpel_user_interface.cpp
	engines/sherlock/scalpel/scalpel_user_interface.h
	engines/sherlock/scalpel/settings.cpp
	engines/sherlock/scalpel/tsage/logo.cpp
	engines/sherlock/scalpel/tsage/logo.h
	engines/sherlock/scene.cpp
	engines/sherlock/scene.h
	engines/sherlock/screen.cpp
	engines/sherlock/screen.h
	engines/sherlock/sherlock.cpp
	engines/sherlock/sherlock.h
	engines/sherlock/sound.cpp
	engines/sherlock/sound.h
	engines/sherlock/surface.cpp
	engines/sherlock/surface.h
	engines/sherlock/talk.cpp
	engines/sherlock/talk.h
	engines/sherlock/tattoo/tattoo.cpp
	engines/sherlock/tattoo/tattoo.h
	engines/sherlock/tattoo/tattoo_scene.cpp
	engines/sherlock/tattoo/tattoo_scene.h
	engines/sherlock/tattoo/tattoo_user_interface.cpp
	engines/sherlock/tattoo/tattoo_user_interface.h
	engines/sherlock/user_interface.cpp
	engines/sherlock/user_interface.h

Changed paths:
  A audio/adlib.cpp
  A audio/alsa_opl.cpp
  A audio/decoders/3do.cpp
  A audio/decoders/3do.h
  A audio/miles.h
  A audio/miles_adlib.cpp
  A audio/miles_mt32.cpp
  A doc/de/Spieletitel Original-Deutsch Deutsch-Original
  A engines/access/martian/martian_player.cpp
  A engines/access/martian/martian_player.h
  A engines/agos/drivers/accolade/adlib.cpp
  A engines/agos/drivers/accolade/driverfile.cpp
  A engines/agos/drivers/accolade/mididriver.h
  A engines/agos/drivers/accolade/mt32.cpp
  A engines/agos/drivers/simon1/adlib.cpp
  A engines/agos/drivers/simon1/adlib.h
  A engines/queen/midiadlib.h
  A engines/sherlock/fixed_text.cpp
  A engines/sherlock/fixed_text.h
  A engines/sherlock/fonts.cpp
  A engines/sherlock/fonts.h
  A engines/sherlock/image_file.cpp
  A engines/sherlock/image_file.h
  A engines/sherlock/scalpel/3do/movie_decoder.cpp
  A engines/sherlock/scalpel/3do/movie_decoder.h
  A engines/sherlock/scalpel/drivers/mt32.cpp
  A engines/sherlock/scalpel/scalpel_darts.cpp
  A engines/sherlock/scalpel/scalpel_darts.h
  A engines/sherlock/scalpel/scalpel_debugger.cpp
  A engines/sherlock/scalpel/scalpel_debugger.h
  A engines/sherlock/scalpel/scalpel_fixed_text.cpp
  A engines/sherlock/scalpel/scalpel_fixed_text.h
  A engines/sherlock/scalpel/scalpel_inventory.cpp
  A engines/sherlock/scalpel/scalpel_inventory.h
  A engines/sherlock/scalpel/scalpel_journal.cpp
  A engines/sherlock/scalpel/scalpel_journal.h
  A engines/sherlock/scalpel/scalpel_map.cpp
  A engines/sherlock/scalpel/scalpel_map.h
  A engines/sherlock/scalpel/scalpel_people.cpp
  A engines/sherlock/scalpel/scalpel_people.h
  A engines/sherlock/scalpel/scalpel_saveload.cpp
  A engines/sherlock/scalpel/scalpel_saveload.h
  A engines/sherlock/scalpel/scalpel_screen.cpp
  A engines/sherlock/scalpel/scalpel_screen.h
  A engines/sherlock/scalpel/scalpel_talk.cpp
  A engines/sherlock/scalpel/scalpel_talk.h
  A engines/sherlock/tattoo/tattoo_darts.cpp
  A engines/sherlock/tattoo/tattoo_darts.h
  A engines/sherlock/tattoo/tattoo_debugger.cpp
  A engines/sherlock/tattoo/tattoo_debugger.h
  A engines/sherlock/tattoo/tattoo_fixed_text.cpp
  A engines/sherlock/tattoo/tattoo_fixed_text.h
  A engines/sherlock/tattoo/tattoo_inventory.cpp
  A engines/sherlock/tattoo/tattoo_inventory.h
  A engines/sherlock/tattoo/tattoo_journal.cpp
  A engines/sherlock/tattoo/tattoo_journal.h
  A engines/sherlock/tattoo/tattoo_map.cpp
  A engines/sherlock/tattoo/tattoo_map.h
  A engines/sherlock/tattoo/tattoo_people.cpp
  A engines/sherlock/tattoo/tattoo_people.h
  A engines/sherlock/tattoo/tattoo_resources.cpp
  A engines/sherlock/tattoo/tattoo_resources.h
  A engines/sherlock/tattoo/tattoo_talk.cpp
  A engines/sherlock/tattoo/tattoo_talk.h
  A engines/sherlock/tattoo/widget_base.cpp
  A engines/sherlock/tattoo/widget_base.h
  A engines/sherlock/tattoo/widget_credits.cpp
  A engines/sherlock/tattoo/widget_credits.h
  A engines/sherlock/tattoo/widget_files.cpp
  A engines/sherlock/tattoo/widget_files.h
  A engines/sherlock/tattoo/widget_foolscap.cpp
  A engines/sherlock/tattoo/widget_foolscap.h
  A engines/sherlock/tattoo/widget_inventory.cpp
  A engines/sherlock/tattoo/widget_inventory.h
  A engines/sherlock/tattoo/widget_lab.cpp
  A engines/sherlock/tattoo/widget_lab.h
  A engines/sherlock/tattoo/widget_options.cpp
  A engines/sherlock/tattoo/widget_options.h
  A engines/sherlock/tattoo/widget_password.cpp
  A engines/sherlock/tattoo/widget_password.h
  A engines/sherlock/tattoo/widget_quit.cpp
  A engines/sherlock/tattoo/widget_quit.h
  A engines/sherlock/tattoo/widget_talk.cpp
  A engines/sherlock/tattoo/widget_talk.h
  A engines/sherlock/tattoo/widget_text.cpp
  A engines/sherlock/tattoo/widget_text.h
  A engines/sherlock/tattoo/widget_tooltip.cpp
  A engines/sherlock/tattoo/widget_tooltip.h
  A engines/sherlock/tattoo/widget_verbs.cpp
  A engines/sherlock/tattoo/widget_verbs.h
  A engines/zvision/detection_tables.h
  R audio/softsynth/adlib.cpp
  R engines/sherlock/scalpel/darts.cpp
  R engines/sherlock/scalpel/darts.h
  R engines/zvision/detection.h
    AUTHORS
    NEWS
    README
    audio/decoders/aiff.cpp
    audio/decoders/aiff.h
    audio/decoders/wave.h
    audio/fmopl.cpp
    audio/fmopl.h
    audio/midiparser.h
    audio/midiparser_xmidi.cpp
    audio/module.mk
    audio/softsynth/opl/dosbox.cpp
    audio/softsynth/opl/dosbox.h
    audio/softsynth/opl/mame.cpp
    audio/softsynth/opl/mame.h
    common/dcl.cpp
    common/dcl.h
    common/fft.cpp
    configure
    devtools/create_project/create_project.cpp
    devtools/create_project/xcode.cpp
    devtools/create_project/xcode.h
    devtools/credits.pl
    devtools/scumm-md5.txt
    doc/cz/PrectiMe
    doc/de/Liesmich
    doc/de/Neues
    engines/access/access.cpp
    engines/access/access.h
    engines/access/amazon/amazon_game.cpp
    engines/access/amazon/amazon_logic.cpp
    engines/access/amazon/amazon_player.cpp
    engines/access/amazon/amazon_resources.cpp
    engines/access/amazon/amazon_resources.h
    engines/access/amazon/amazon_scripts.cpp
    engines/access/amazon/amazon_scripts.h
    engines/access/asurface.cpp
    engines/access/asurface.h
    engines/access/bubble_box.cpp
    engines/access/bubble_box.h
    engines/access/char.cpp
    engines/access/char.h
    engines/access/decompress.cpp
    engines/access/decompress.h
    engines/access/detection_tables.h
    engines/access/inventory.cpp
    engines/access/inventory.h
    engines/access/martian/martian_game.cpp
    engines/access/martian/martian_game.h
    engines/access/martian/martian_resources.cpp
    engines/access/martian/martian_resources.h
    engines/access/martian/martian_room.cpp
    engines/access/martian/martian_room.h
    engines/access/martian/martian_scripts.cpp
    engines/access/martian/martian_scripts.h
    engines/access/module.mk
    engines/access/player.cpp
    engines/access/player.h
    engines/access/resources.cpp
    engines/access/resources.h
    engines/access/room.cpp
    engines/access/room.h
    engines/access/screen.cpp
    engines/access/screen.h
    engines/access/scripts.cpp
    engines/access/scripts.h
    engines/access/sound.cpp
    engines/access/sound.h
    engines/access/video.cpp
    engines/access/video.h
    engines/agi/detection_tables.h
    engines/agi/graphics.cpp
    engines/agi/preagi_mickey.cpp
    engines/agos/agos.cpp
    engines/agos/detection_tables.h
    engines/agos/gfx.cpp
    engines/agos/input.cpp
    engines/agos/midi.cpp
    engines/agos/midi.h
    engines/agos/midiparser_s1d.cpp
    engines/agos/module.mk
    engines/agos/res_snd.cpp
    engines/agos/sound.cpp
    engines/agos/zones.cpp
    engines/bbvs/sound.h
    engines/cine/sound.cpp
    engines/cruise/sound.cpp
    engines/fullpipe/motion.cpp
    engines/gob/gob.cpp
    engines/gob/map_v2.cpp
    engines/gob/sound/adlib.cpp
    engines/gob/sound/adlib.h
    engines/gob/sound/adlplayer.cpp
    engines/gob/sound/adlplayer.h
    engines/gob/sound/musplayer.cpp
    engines/gob/sound/musplayer.h
    engines/gob/sound/sound.cpp
    engines/gob/sound/sound.h
    engines/groovie/music.cpp
    engines/groovie/music.h
    engines/kyra/sound_adlib.cpp
    engines/lure/res.h
    engines/made/made.cpp
    engines/made/music.cpp
    engines/made/music.h
    engines/made/pmvplayer.cpp
    engines/made/screenfx.cpp
    engines/made/sound.cpp
    engines/made/sound.h
    engines/mads/hotspots.cpp
    engines/mads/nebular/sound_nebular.cpp
    engines/mads/nebular/sound_nebular.h
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/globals_phantom.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/sound.cpp
    engines/mads/sound.h
    engines/mohawk/console.cpp
    engines/mohawk/detection_tables.h
    engines/mohawk/livingbooks.cpp
    engines/mohawk/livingbooks_code.cpp
    engines/mohawk/livingbooks_code.h
    engines/mohawk/myst_areas.cpp
    engines/mohawk/myst_stacks/channelwood.cpp
    engines/mohawk/myst_stacks/dni.cpp
    engines/mohawk/myst_stacks/intro.cpp
    engines/mohawk/myst_stacks/mechanical.cpp
    engines/mohawk/myst_stacks/myst.cpp
    engines/mohawk/myst_stacks/stoneship.cpp
    engines/mohawk/riven.cpp
    engines/mohawk/riven_external.cpp
    engines/mohawk/riven_scripts.cpp
    engines/mohawk/video.cpp
    engines/mohawk/video.h
    engines/mortevielle/detection_tables.h
    engines/mortevielle/menu.cpp
    engines/parallaction/adlib.cpp
    engines/pegasus/sound.cpp
    engines/queen/midiadlib.cpp
    engines/queen/music.cpp
    engines/saga/detection_tables.h
    engines/saga/introproc_ihnm.cpp
    engines/saga/introproc_ite.cpp
    engines/saga/music.cpp
    engines/saga/music.h
    engines/saga/saga.cpp
    engines/saga/saga.h
    engines/saga/scene.cpp
    engines/saga/scene.h
    engines/saga/script.cpp
    engines/saga/sndres.cpp
    engines/sci/detection.cpp
    engines/sci/detection_tables.h
    engines/sci/engine/kfile.cpp
    engines/sci/engine/script.cpp
    engines/sci/graphics/transitions.cpp
    engines/sci/graphics/transitions.h
    engines/sci/sound/audio.cpp
    engines/sci/sound/drivers/adlib.cpp
    engines/scumm/detection_tables.h
    engines/scumm/players/player_ad.cpp
    engines/scumm/players/player_ad.h
    engines/scumm/scumm-md5.h
    engines/scumm/scumm.cpp
    engines/scumm/scumm.h
    engines/scumm/string.cpp
    engines/sherlock/animation.cpp
    engines/sherlock/animation.h
    engines/sherlock/debugger.cpp
    engines/sherlock/debugger.h
    engines/sherlock/detection.cpp
    engines/sherlock/detection_tables.h
    engines/sherlock/events.cpp
    engines/sherlock/events.h
    engines/sherlock/inventory.cpp
    engines/sherlock/inventory.h
    engines/sherlock/journal.cpp
    engines/sherlock/journal.h
    engines/sherlock/map.cpp
    engines/sherlock/map.h
    engines/sherlock/module.mk
    engines/sherlock/music.cpp
    engines/sherlock/music.h
    engines/sherlock/objects.cpp
    engines/sherlock/objects.h
    engines/sherlock/people.cpp
    engines/sherlock/people.h
    engines/sherlock/resources.cpp
    engines/sherlock/resources.h
    engines/sherlock/saveload.cpp
    engines/sherlock/saveload.h
    engines/sherlock/scalpel/drivers/adlib.cpp
    engines/sherlock/scalpel/drivers/mididriver.h
    engines/sherlock/scalpel/scalpel.cpp
    engines/sherlock/scalpel/scalpel.h
    engines/sherlock/scalpel/scalpel_scene.cpp
    engines/sherlock/scalpel/scalpel_scene.h
    engines/sherlock/scalpel/scalpel_user_interface.cpp
    engines/sherlock/scalpel/scalpel_user_interface.h
    engines/sherlock/scalpel/settings.cpp
    engines/sherlock/scalpel/tsage/logo.cpp
    engines/sherlock/scalpel/tsage/logo.h
    engines/sherlock/scene.cpp
    engines/sherlock/scene.h
    engines/sherlock/screen.cpp
    engines/sherlock/screen.h
    engines/sherlock/sherlock.cpp
    engines/sherlock/sherlock.h
    engines/sherlock/sound.cpp
    engines/sherlock/sound.h
    engines/sherlock/surface.cpp
    engines/sherlock/surface.h
    engines/sherlock/talk.cpp
    engines/sherlock/talk.h
    engines/sherlock/tattoo/tattoo.cpp
    engines/sherlock/tattoo/tattoo.h
    engines/sherlock/tattoo/tattoo_scene.cpp
    engines/sherlock/tattoo/tattoo_scene.h
    engines/sherlock/tattoo/tattoo_user_interface.cpp
    engines/sherlock/tattoo/tattoo_user_interface.h
    engines/sherlock/user_interface.cpp
    engines/sherlock/user_interface.h
    engines/sky/music/adlibchannel.cpp
    engines/sky/music/adlibchannel.h
    engines/sky/music/adlibmusic.cpp
    engines/sky/music/adlibmusic.h
    engines/sword25/fmv/movieplayer.cpp
    engines/tinsel/music.cpp
    engines/tinsel/music.h
    engines/tinsel/tinsel.cpp
    engines/toltecs/music.cpp
    engines/toltecs/music.h
    engines/tony/window.cpp
    engines/tsage/detection_tables.h
    engines/tsage/globals.cpp
    engines/tsage/sherlock/sherlock_logo.cpp
    engines/tsage/sherlock/sherlock_logo.h
    engines/tsage/sound.cpp
    engines/tsage/sound.h
    engines/tsage/tsage.cpp
    engines/wintermute/base/base_script_holder.cpp
    engines/zvision/configure.engine
    engines/zvision/core/clock.h
    engines/zvision/core/console.cpp
    engines/zvision/detection.cpp
    engines/zvision/file/save_manager.cpp
    engines/zvision/graphics/render_manager.cpp
    engines/zvision/scripting/actions.cpp
    engines/zvision/scripting/actions.h
    engines/zvision/scripting/controls/input_control.cpp
    engines/zvision/scripting/controls/input_control.h
    engines/zvision/scripting/menu.cpp
    engines/zvision/scripting/menu.h
    engines/zvision/sound/zork_raw.cpp
    engines/zvision/text/string_manager.h
    engines/zvision/text/text.h
    engines/zvision/zvision.cpp
    engines/zvision/zvision.h
    gui/credits.h
    gui/debugger.cpp
    gui/debugger.h
    gui/launcher.cpp
    gui/options.cpp
    gui/themes/translations.dat
    image/codecs/cinepak.cpp
    image/codecs/cinepak.h
    po/POTFILES
    po/be_BY.po
    po/ca_ES.po
    po/cs_CZ.po
    po/da_DA.po
    po/de_DE.po
    po/es_ES.po
    po/eu.po
    po/fi_FI.po
    po/fr_FR.po
    po/gl_ES.po
    po/hu_HU.po
    po/it_IT.po
    po/nb_NO.po
    po/nl_NL.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





Commit: 63ad675abf7cc8585da30ef97bebe0c6cd502a58
    https://github.com/scummvm/scummvm/commit/63ad675abf7cc8585da30ef97bebe0c6cd502a58
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-09-21T21:18:19+02:00

Commit Message:
MADS: Allow multiple animations for Phantom and later games

Changed paths:
    engines/mads/game.cpp
    engines/mads/nebular/nebular_scenes1.cpp
    engines/mads/nebular/nebular_scenes2.cpp
    engines/mads/nebular/nebular_scenes3.cpp
    engines/mads/nebular/nebular_scenes4.cpp
    engines/mads/nebular/nebular_scenes5.cpp
    engines/mads/nebular/nebular_scenes6.cpp
    engines/mads/nebular/nebular_scenes7.cpp
    engines/mads/nebular/nebular_scenes8.cpp
    engines/mads/scene.cpp
    engines/mads/scene.h



diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index 91f6cd5..332ac43 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -297,8 +297,10 @@ void Game::sectionLoop() {
 		_vm->_events->waitCursor();
 		_kernelMode = KERNEL_ROOM_PRELOAD;
 
-		delete _scene._activeAnimation;
-		_scene._activeAnimation = nullptr;
+		for (int i = 0; i < 10; i++) {
+			delete _scene._animation[i];
+			_scene._animation[i] = nullptr;
+		}
 
 		_scene._reloadSceneFlag = false;
 
diff --git a/engines/mads/nebular/nebular_scenes1.cpp b/engines/mads/nebular/nebular_scenes1.cpp
index fd97f71..d5e1fc0 100644
--- a/engines/mads/nebular/nebular_scenes1.cpp
+++ b/engines/mads/nebular/nebular_scenes1.cpp
@@ -258,32 +258,32 @@ void Scene101::step() {
 		break;
 	}
 
-	if (_scene->_activeAnimation != nullptr) {
-		if ((_scene->_activeAnimation->getCurrentFrame() >= 6) && (_messageNum == 0)) {
+	if (_scene->_animation[0] != nullptr) {
+		if ((_scene->_animation[0]->getCurrentFrame() >= 6) && (_messageNum == 0)) {
 			_messageNum++;
 			_scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(49));
 			_posY += 14;
 		}
 
-		if ((_scene->_activeAnimation->getCurrentFrame() >= 7) && (_messageNum == 1)) {
+		if ((_scene->_animation[0]->getCurrentFrame() >= 7) && (_messageNum == 1)) {
 			_messageNum++;
 			_scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(54));
 			_posY += 14;
 		}
 
-		if ((_scene->_activeAnimation->getCurrentFrame() >= 10) && (_messageNum == 2)) {
+		if ((_scene->_animation[0]->getCurrentFrame() >= 10) && (_messageNum == 2)) {
 			_messageNum++;
 			_scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(55));
 			_posY += 14;
 		}
 
-		if ((_scene->_activeAnimation->getCurrentFrame() >= 17) && (_messageNum == 3)) {
+		if ((_scene->_animation[0]->getCurrentFrame() >= 17) && (_messageNum == 3)) {
 			_messageNum++;
 			_scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(56));
 			_posY += 14;
 		}
 
-		if ((_scene->_activeAnimation->getCurrentFrame() >= 20) && (_messageNum == 4)) {
+		if ((_scene->_animation[0]->getCurrentFrame() >= 20) && (_messageNum == 4)) {
 			_messageNum++;
 			_scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(50));
 			_posY += 14;
@@ -1782,7 +1782,7 @@ void Scene104::step() {
 	if ((_game._player._special > 0) && _game._player._stepEnabled)
 		_game._player._stepEnabled = false;
 
-	if (_kargShootingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) {
+	if (_kargShootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
 		_kargShootingFl = false;
 	}
@@ -2079,7 +2079,7 @@ void Scene106::step() {
 		}
 	}
 
-	if (_firstEmergingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) {
+	if (_firstEmergingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
 		_firstEmergingFl = false;
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
 	}
@@ -2263,7 +2263,7 @@ void Scene107::enter() {
 }
 
 void Scene107::step() {
-	if (_shootingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) {
+	if (_shootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) {
 		_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
 		_shootingFl = false;
 	}
@@ -2919,7 +2919,7 @@ void Scene110::actions() {
 		switch (_game._trigger) {
 		case 0:
 			_scene->loadAnimation(Resources::formatName(110, 'T', 0, EXT_AA, ""), 1);
-			_scene->_activeAnimation->setNextFrameTimer(_game._player._ticksAmount + _game._player._priorTimer);
+			_scene->_animation[0]->setNextFrameTimer(_game._player._ticksAmount + _game._player._priorTimer);
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			break;
@@ -3066,7 +3066,7 @@ void Scene111::step() {
 	if (_game._trigger == 73)
 		_vm->_sound->command(37);
 
-	if (_rexDivingFl && (_scene->_activeAnimation->getCurrentFrame() >= 9)) {
+	if (_rexDivingFl && (_scene->_animation[0]->getCurrentFrame() >= 9)) {
 		_vm->_sound->command(36);
 		_rexDivingFl = false;
 	}
@@ -3138,8 +3138,8 @@ void Scene112::enter() {
 }
 
 void Scene112::step() {
-	if ((_scene->_activeAnimation != nullptr) && (_game._storyMode == STORYMODE_NICE)) {
-		if (_scene->_activeAnimation->getCurrentFrame() >= 54) {
+	if ((_scene->_animation[0] != nullptr) && (_game._storyMode == STORYMODE_NICE)) {
+		if (_scene->_animation[0]->getCurrentFrame() >= 54) {
 			_scene->freeAnimation();
 			_game._trigger = 70;
 		}
diff --git a/engines/mads/nebular/nebular_scenes2.cpp b/engines/mads/nebular/nebular_scenes2.cpp
index 1cbd6f5..ad15f83 100644
--- a/engines/mads/nebular/nebular_scenes2.cpp
+++ b/engines/mads/nebular/nebular_scenes2.cpp
@@ -484,7 +484,7 @@ void Scene202::enter() {
 		}
 
 		_scene->loadAnimation(formAnimName('M', -1), 71);
-		_scene->_activeAnimation->setCurrentFrame(200);
+		_scene->_animation[0]->setCurrentFrame(200);
 	} else {
 		if (_ladderTopFl) {
 			_game._player._visible = false;
@@ -596,7 +596,7 @@ void Scene202::step() {
 		break;
 	}
 
-	if (!_scene->_activeAnimation && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (_meteoClock2 <= _scene->_frameStartTime) && (_meteoClock1 <= _scene->_frameStartTime)) {
+	if (!_scene->_animation[0] && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (_meteoClock2 <= _scene->_frameStartTime) && (_meteoClock1 <= _scene->_frameStartTime)) {
 		int randVal = _vm->getRandomNumber(1, 500);
 		int threshold = 1;
 		if (_ladderTopFl)
@@ -615,11 +615,11 @@ void Scene202::step() {
 		}
 	}
 
-	if (!_scene->_activeAnimation)
+	if (!_scene->_animation[0])
 		return;
 
 	if (_waitingMeteoFl) {
-		if (_scene->_activeAnimation->getCurrentFrame() >= 200) {
+		if (_scene->_animation[0]->getCurrentFrame() >= 200) {
 			if ((_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) || _globals[kLadderBroken]) {
 				_scene->_nextSceneId = 213;
 			} else {
@@ -628,7 +628,7 @@ void Scene202::step() {
 			}
 		}
 
-		if ((_scene->_activeAnimation->getCurrentFrame() == 160) && (_meteoFrame != _scene->_activeAnimation->getCurrentFrame())) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 160) && (_meteoFrame != _scene->_animation[0]->getCurrentFrame())) {
 			Common::Point msgPos;
 			int msgFlag;
 			if (!_ladderTopFl) {
@@ -647,15 +647,15 @@ void Scene202::step() {
 		_toTeleportFl = true;
 	}
 
-	if (_scene->_activeAnimation->getCurrentFrame() == _meteoFrame) {
+	if (_scene->_animation[0]->getCurrentFrame() == _meteoFrame) {
 		return;
 	}
 
-	_meteoFrame = _scene->_activeAnimation->getCurrentFrame();
+	_meteoFrame = _scene->_animation[0]->getCurrentFrame();
 	int randVal = _vm->getRandomNumber(1, 1000);
 	int frameStep = -1;
 
-	switch (_scene->_activeAnimation->getCurrentFrame()) {
+	switch (_scene->_animation[0]->getCurrentFrame()) {
 	case 42:
 	case 77:
 	case 96:
@@ -693,8 +693,8 @@ void Scene202::step() {
 		break;
 	}
 
-	if (frameStep >= 0 && frameStep != _scene->_activeAnimation->getCurrentFrame() + 1) {
-		_scene->_activeAnimation->setCurrentFrame(frameStep);
+	if (frameStep >= 0 && frameStep != _scene->_animation[0]->getCurrentFrame() + 1) {
+		_scene->_animation[0]->setCurrentFrame(frameStep);
 		_meteoFrame = frameStep;
 	}
 }
@@ -797,7 +797,7 @@ void Scene202::actions() {
 		_scene->_nextSceneId = 203;
 	} else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) {
 		if (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) {
-			if (_scene->_activeAnimation)
+			if (_scene->_animation[0])
 				_globals[kMeteorologistStatus] = METEOROLOGIST_PRESENT;
 			else
 				_globals[kMeteorologistStatus] = METEOROLOGIST_ABSENT;
@@ -890,7 +890,7 @@ void Scene202::actions() {
 				_globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
-				if (_scene->_activeAnimation) {
+				if (_scene->_animation[0]) {
 					_waitingMeteoFl = true;
 					_globals[kMeteorologistWatch] = METEOROLOGIST_GROUND;
 				} else {
@@ -898,7 +898,7 @@ void Scene202::actions() {
 				}
 				break;
 			case 2:
-				if (!_scene->_activeAnimation && !_meteorologistSpecial) {
+				if (!_scene->_animation[0] && !_meteorologistSpecial) {
 					_vm->_dialogs->show(20222);
 				}
 				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
@@ -932,13 +932,13 @@ void Scene202::actions() {
 				_globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, -2);
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(247, 82));
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
-				if (_scene->_activeAnimation) {
-					if (_scene->_activeAnimation->getCurrentFrame() > 200) {
+				if (_scene->_animation[0]) {
+					if (_scene->_animation[0]->getCurrentFrame() > 200) {
 						_scene->_sequences.addTimer(120, 2);
 					} else {
 						_waitingMeteoFl = true;
 						_globals[kMeteorologistWatch] = METEOROLOGIST_GONE;
-						if ((_scene->_activeAnimation->getCurrentFrame() >= 44) && (_scene->_activeAnimation->getCurrentFrame() <= 75)) {
+						if ((_scene->_animation[0]->getCurrentFrame() >= 44) && (_scene->_animation[0]->getCurrentFrame() <= 75)) {
 							_scene->_kernelMessages.reset();
 							int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(100));
 							_scene->_kernelMessages.setQuoted(msgIndex, 4, false);
@@ -952,7 +952,7 @@ void Scene202::actions() {
 				}
 				break;
 			case 2:
-				if (!_scene->_activeAnimation)
+				if (!_scene->_animation[0])
 					_vm->_dialogs->show(20222);
 				_meteorologistSpecial = false;
 				_scene->_sequences.remove(_globals._sequenceIndexes[10]);
@@ -1227,7 +1227,7 @@ void Scene205::enter() {
 
 	if (_globals[kSexOfRex] != SEX_MALE) {
 		_scene->loadAnimation(formAnimName('a', -1));
-		_scene->_activeAnimation->_resetFlag = true;
+		_scene->_animation[0]->_resetFlag = true;
 	} else {
 		_beingKicked = true;
 		_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
@@ -1379,8 +1379,8 @@ void Scene205::actions() {
 			_scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], -1);
 			_vm->_sound->command(27);
 		} else if (_game._trigger == 1) {
-			if (_scene->_activeAnimation != nullptr)
-				_scene->_activeAnimation->resetSpriteSetsCount();
+			if (_scene->_animation[0] != nullptr)
+				_scene->_animation[0]->resetSpriteSetsCount();
 
 			_vm->_dialogs->show(20516);
 			_scene->_reloadSceneFlag = true;
@@ -1746,9 +1746,9 @@ void Scene208::enter() {
 }
 
 void Scene208::step() {
-	if (_boundingFl && _scene->_activeAnimation &&
-			(_rhotundaTime <= _scene->_activeAnimation->getCurrentFrame())) {
-		_rhotundaTime = _scene->_activeAnimation->getCurrentFrame();
+	if (_boundingFl && _scene->_animation[0] &&
+			(_rhotundaTime <= _scene->_animation[0]->getCurrentFrame())) {
+		_rhotundaTime = _scene->_animation[0]->getCurrentFrame();
 
 		if (_rhotundaTime == 125)
 			_scene->_sequences.remove(_globals._sequenceIndexes[4]);
@@ -4064,7 +4064,7 @@ void Scene210::setDialogNode(int node) {
 			_vm->_palette->lock();
 			_scene->_kernelMessages.reset();
 			_scene->freeAnimation();
-			_scene->_activeAnimation = nullptr;
+			_scene->_animation[0] = nullptr;
 			_scene->resetScene();
 
 			_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
@@ -4263,8 +4263,8 @@ void Scene210::enter() {
 		}
 
 		restoreDialogNode(_curDialogNode, quote, number);
-		if (_scene->_activeAnimation)
-			_scene->_activeAnimation->setCurrentFrame(131);
+		if (_scene->_animation[0])
+			_scene->_animation[0]->setCurrentFrame(131);
 	}
 
 	_vm->_palette->setEntry(252, 63, 63, 10);
@@ -4274,9 +4274,9 @@ void Scene210::enter() {
 }
 
 void Scene210::step() {
-	if ((_twinkleAnimationType == 1) && _scene->_activeAnimation) {
-		if (_twinklesCurrentFrame != _scene->_activeAnimation->getCurrentFrame()) {
-			_twinklesCurrentFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_twinkleAnimationType == 1) && _scene->_animation[0]) {
+		if (_twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame();
 			int reset_frame = -1;
 			int random = _vm->getRandomNumber(1, 1000);
 
@@ -4396,8 +4396,8 @@ void Scene210::step() {
 			}
 
 			if (reset_frame >= 0) {
-				if (reset_frame != _scene->_activeAnimation->getCurrentFrame()) {
-					_scene->_activeAnimation->setCurrentFrame(reset_frame);
+				if (reset_frame != _scene->_animation[0]->getCurrentFrame()) {
+					_scene->_animation[0]->setCurrentFrame(reset_frame);
 					_twinklesCurrentFrame = reset_frame;
 				}
 
@@ -4411,9 +4411,9 @@ void Scene210::step() {
 		}
 	}
 
-	if ((_twinkleAnimationType == 2) && _scene->_activeAnimation) {
-		if (_twinklesCurrentFrame != _scene->_activeAnimation->getCurrentFrame()) {
-			_twinklesCurrentFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_twinkleAnimationType == 2) && _scene->_animation[0]) {
+		if (_twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame();
 			int reset_frame = -1;
 
 			if (_twinklesCurrentFrame == 53) {
@@ -4422,8 +4422,8 @@ void Scene210::step() {
 			} else if ((_twinklesCurrentFrame == 75) && _shouldTalk)
 				reset_frame = 60;
 
-			if ((reset_frame >= 0) && (reset_frame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(reset_frame);
+			if ((reset_frame >= 0) && (reset_frame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(reset_frame);
 				_twinklesCurrentFrame = reset_frame;
 			}
 		}
@@ -4646,7 +4646,7 @@ void Scene211::enter() {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->loadAnimation(formAnimName('A', -1), 100);
-		_scene->_activeAnimation->setCurrentFrame(169);
+		_scene->_animation[0]->setCurrentFrame(169);
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._playerPos = Common::Point(310, 31);
 		_game._player._facing = FACING_SOUTHWEST;
@@ -4725,8 +4725,8 @@ void Scene211::step() {
 		}
 	}
 
-	if (_ambushFl && (_scene->_activeAnimation->getCurrentFrame() > _monkeyFrame)) {
-		_monkeyFrame = _scene->_activeAnimation->getCurrentFrame();
+	if (_ambushFl && (_scene->_animation[0]->getCurrentFrame() > _monkeyFrame)) {
+		_monkeyFrame = _scene->_animation[0]->getCurrentFrame();
 		switch (_monkeyFrame) {
 		case 2: {
 			int msgIndex = _scene->_kernelMessages.add(Common::Point(12, 4), 0xFDFC, 0, 0, 60, _game.getQuote(157));
@@ -4798,9 +4798,9 @@ void Scene211::step() {
 			_wakeFl = false;
 		}
 
-		if (_scene->_activeAnimation->getCurrentFrame() > _monkeyFrame) {
-			_monkeyFrame = _scene->_activeAnimation->getCurrentFrame();
-			switch (_scene->_activeAnimation->getCurrentFrame()) {
+		if (_scene->_animation[0]->getCurrentFrame() > _monkeyFrame) {
+			_monkeyFrame = _scene->_animation[0]->getCurrentFrame();
+			switch (_scene->_animation[0]->getCurrentFrame()) {
 			case 177: {
 				int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(165));
 				_scene->_kernelMessages.setQuoted(msgIndex, 4, true);
diff --git a/engines/mads/nebular/nebular_scenes3.cpp b/engines/mads/nebular/nebular_scenes3.cpp
index 5a6edbf..717dd85 100644
--- a/engines/mads/nebular/nebular_scenes3.cpp
+++ b/engines/mads/nebular/nebular_scenes3.cpp
@@ -293,8 +293,8 @@ void Scene302::step() {
 	if (_game._trigger == 71)
 		_scene->_nextSceneId = 303;
 
-	if ((_scene->_activeAnimation != nullptr) && (_scene->_activeAnimation->getCurrentFrame() != _oldFrame)) {
-		_oldFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_scene->_animation[0] != nullptr) && (_scene->_animation[0]->getCurrentFrame() != _oldFrame)) {
+		_oldFrame = _scene->_animation[0]->getCurrentFrame();
 		if (_oldFrame == 147) {
 			_game._objects.setRoom(OBJ_POISON_DARTS, 1);
 			_game._objects.setRoom(OBJ_BLOWGUN, 1);
@@ -828,23 +828,23 @@ void Scene307::enter() {
 void Scene307::step() {
 	handleForceField(&_forceField, &_globals._spriteIndexes[0]);
 
-	if ((_animationMode == 1) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() == 126) {
+	if ((_animationMode == 1) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() == 126) {
 			_forceField._flag = false;
 			_vm->_sound->command(5);
 		}
 
-		if (_scene->_activeAnimation->getCurrentFrame() == 194) {
+		if (_scene->_animation[0]->getCurrentFrame() == 194) {
 			_forceField._flag = true;
 			_vm->_sound->command(24);
 		}
 	}
 
-	if ((_animationMode == 2) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() == 54)
+	if ((_animationMode == 2) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() == 54)
 			_forceField._flag = false;
 
-		if (_scene->_activeAnimation->getCurrentFrame() == 150) {
+		if (_scene->_animation[0]->getCurrentFrame() == 150) {
 			_game._player._visible = false;
 			_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
 		}
@@ -869,7 +869,7 @@ void Scene307::step() {
 		}
 		_lastFrameTime = _scene->_frameStartTime;
 
-		if ((_guardTime > 3000) && !_duringPeeingFl && (_scene->_activeAnimation == nullptr)
+		if ((_guardTime > 3000) && !_duringPeeingFl && (_scene->_animation[0] == nullptr)
 		&& (_game._screenObjects._inputMode != kInputConversation) && _globals[kMetBuddyBeast] && !_activePrisonerFl) {
 			if (!_game._objects.isInInventory(OBJ_SCALPEL) && !_grateOpenedFl) {
 				_game._player._stepEnabled = false;
@@ -879,7 +879,7 @@ void Scene307::step() {
 				_scene->loadAnimation(formAnimName('b', -1), 70);
 			}
 			_guardTime = 0;
-		} else if ((_prisonerTimer > 300) && (_game._screenObjects._inputMode != kInputConversation) && (_scene->_activeAnimation == nullptr) && !_activePrisonerFl) {
+		} else if ((_prisonerTimer > 300) && (_game._screenObjects._inputMode != kInputConversation) && (_scene->_animation[0] == nullptr) && !_activePrisonerFl) {
 			if (!_globals[kMetBuddyBeast]) {
 				int idx = _scene->_kernelMessages.add(Common::Point(5, 51), 0xFDFC, 0, 81, 120, _game.getQuote(_prisonerMessageId));
 				_scene->_kernelMessages.setQuoted(idx, 4, true);
@@ -1380,9 +1380,9 @@ void Scene309::enter() {
 	_game._player._stepEnabled = false;
 	_scene->loadAnimation(formAnimName('a', -1), 60);
 
-	_characterSpriteIndexes[0] = _scene->_activeAnimation->_spriteListIndexes[2];
-	_characterSpriteIndexes[1] = _scene->_activeAnimation->_spriteListIndexes[2];
-	_characterSpriteIndexes[2] = _scene->_activeAnimation->_spriteListIndexes[1];
+	_characterSpriteIndexes[0] = _scene->_animation[0]->_spriteListIndexes[2];
+	_characterSpriteIndexes[1] = _scene->_animation[0]->_spriteListIndexes[2];
+	_characterSpriteIndexes[2] = _scene->_animation[0]->_spriteListIndexes[1];
 
 	_messagesIndexes[0] = -1;
 	_messagesIndexes[1] = -1;
@@ -1404,9 +1404,9 @@ void Scene309::step() {
 	if (_game._trigger == 62)
 		_messagesIndexes[2] = -1;
 
-	if (_scene->_activeAnimation != nullptr) {
-		if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) {
-			_lastFrame = _scene->_activeAnimation->getCurrentFrame();
+	if (_scene->_animation[0] != nullptr) {
+		if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_lastFrame = _scene->_animation[0]->getCurrentFrame();
 			if (_lastFrame == 39) {
 				_messagesIndexes[0] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 61, 210, _game.getQuote(348));
 				_messagesIndexes[1] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 0, 210, _game.getQuote(349));
@@ -1419,15 +1419,15 @@ void Scene309::step() {
 				if (_messagesIndexes[charIdx] >= 0) {
 					bool match = false;
 					int j = -1;
-					for (j = _scene->_activeAnimation->_oldFrameEntry; j < _scene->_activeAnimation->_header._frameEntriesCount; j++) {
-						if (_scene->_activeAnimation->_frameEntries[j]._spriteSlot._spritesIndex == _characterSpriteIndexes[charIdx]) {
+					for (j = _scene->_animation[0]->_oldFrameEntry; j < _scene->_animation[0]->_header._frameEntriesCount; j++) {
+						if (_scene->_animation[0]->_frameEntries[j]._spriteSlot._spritesIndex == _characterSpriteIndexes[charIdx]) {
 							match = true;
 							break;
 						}
 					}
 
 					if (match) {
-						SpriteSlotSubset *curSpriteSlot = &_scene->_activeAnimation->_frameEntries[j]._spriteSlot;
+						SpriteSlotSubset *curSpriteSlot = &_scene->_animation[0]->_frameEntries[j]._spriteSlot;
 						_scene->_kernelMessages._entries[_messagesIndexes[charIdx]]._position.x = curSpriteSlot->_position.x;
 						_scene->_kernelMessages._entries[_messagesIndexes[charIdx]]._position.y = curSpriteSlot->_position.y - (50 + (14 * ((charIdx == 0) ? 2 : 1)));
 					}
@@ -2602,7 +2602,7 @@ void Scene318::enter() {
 
 	if (_globals[kAfterHavoc]) {
 		_scene->loadAnimation(formAnimName('f', -1));
-		_scene->_activeAnimation->_resetFlag = true;
+		_scene->_animation[0]->_resetFlag = true;
 	} else if (!_globals[kHasSeenProfPyro]) {
 		_scene->_hotspots.activate(NOUN_PROFESSORS_GURNEY, false);
 		_scene->_hotspots.activate(NOUN_PROFESSOR, false);
@@ -2705,9 +2705,9 @@ void Scene318::enter() {
 }
 
 void Scene318::step() {
-	if ((_scene->_activeAnimation != nullptr) && (_animMode == 2)) {
-		if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) {
-			_lastFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_scene->_animation[0] != nullptr) && (_animMode == 2)) {
+		if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_lastFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
 			switch (_lastFrame) {
@@ -2759,8 +2759,8 @@ void Scene318::step() {
 				break;
 			}
 
-			if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextFrame);
+			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextFrame);
 				_lastFrame = nextFrame;
 			}
 		}
@@ -3185,11 +3185,11 @@ void Scene319::enter() {
 }
 
 void Scene319::step() {
-	if (_scene->_activeAnimation == nullptr)
+	if (_scene->_animation[0] == nullptr)
 		return;
 
-	if (_animFrame != _scene->_activeAnimation->getCurrentFrame()) {
-		_animFrame = _scene->_activeAnimation->getCurrentFrame();
+	if (_animFrame != _scene->_animation[0]->getCurrentFrame()) {
+		_animFrame = _scene->_animation[0]->getCurrentFrame();
 		int nextFrame = -1;
 		if (_animMode == 1) {
 			switch (_animFrame) {
@@ -3305,8 +3305,8 @@ void Scene319::step() {
 		if ((_animMode == 4) && (_animFrame == 16))
 			_vm->_screen._shakeCountdown = 80;
 
-		if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-			_scene->_activeAnimation->setCurrentFrame(nextFrame);
+		if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+			_scene->_animation[0]->setCurrentFrame(nextFrame);
 			_animFrame = nextFrame;
 		}
 	}
@@ -3320,11 +3320,11 @@ void Scene319::step() {
 		_scene->freeAnimation();
 		_scene->loadAnimation(formAnimName('b', 0));
 		if (_nextAction1 == 3)
-			_scene->_activeAnimation->setCurrentFrame(85);
+			_scene->_animation[0]->setCurrentFrame(85);
 		else if (_nextAction1 == 1)
-			_scene->_activeAnimation->setCurrentFrame(40);
+			_scene->_animation[0]->setCurrentFrame(40);
 
-		_animFrame = _scene->_activeAnimation->getCurrentFrame();
+		_animFrame = _scene->_animation[0]->getCurrentFrame();
 		_slacheTalkingFl = true;
 		_vm->_screen._shakeCountdown = 1;
 
@@ -3710,9 +3710,9 @@ void Scene320::enter() {
 }
 
 void Scene320::step() {
-	if (_scene->_activeAnimation != nullptr) {
-		if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) {
-			_lastFrame = _scene->_activeAnimation->getCurrentFrame();
+	if (_scene->_animation[0] != nullptr) {
+		if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_lastFrame = _scene->_animation[0]->getCurrentFrame();
 			switch (_lastFrame) {
 			case 95:
 				_blinkFl = true;
@@ -3892,8 +3892,8 @@ void Scene321::enter() {
 }
 
 void Scene321::step() {
-	if (_scene->_activeAnimation != nullptr) {
-		if ((_scene->_activeAnimation->getCurrentFrame() >= 260) && (_globals[kSexOfRex] == REX_MALE) && (_game._storyMode >= STORYMODE_NICE))
+	if (_scene->_animation[0] != nullptr) {
+		if ((_scene->_animation[0]->getCurrentFrame() >= 260) && (_globals[kSexOfRex] == REX_MALE) && (_game._storyMode >= STORYMODE_NICE))
 			_scene->_nextSceneId = 316;
 	}
 
diff --git a/engines/mads/nebular/nebular_scenes4.cpp b/engines/mads/nebular/nebular_scenes4.cpp
index c981f6a..19e1fc7 100644
--- a/engines/mads/nebular/nebular_scenes4.cpp
+++ b/engines/mads/nebular/nebular_scenes4.cpp
@@ -876,7 +876,7 @@ void Scene402::enter() {
 	_refuseAlienLiquor = false;
 
 	_scene->loadAnimation(Resources::formatName(402, 'd', 1, EXT_AA, ""));
-	_scene->_activeAnimation->_resetFlag = true;
+	_scene->_animation[0]->_resetFlag = true;
 
 	_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
@@ -1536,43 +1536,43 @@ void Scene402::step() {
 	if (_game._trigger == 32)
 		_rightWomanMoving = false;
 
-	if (_scene->_activeAnimation->getCurrentFrame() == 1) {
+	if (_scene->_animation[0]->getCurrentFrame() == 1) {
 		switch (_vm->getRandomNumber(1, 50)) {
 		case 1:
-			_scene->_activeAnimation->setCurrentFrame(2);
+			_scene->_animation[0]->setCurrentFrame(2);
 			break;
 
 		case 2:
-			_scene->_activeAnimation->setCurrentFrame(7);
+			_scene->_animation[0]->setCurrentFrame(7);
 			break;
 
 		case 3:
-			_scene->_activeAnimation->setCurrentFrame(11);
+			_scene->_animation[0]->setCurrentFrame(11);
 			break;
 
 		default:
-			_scene->_activeAnimation->setCurrentFrame(0);
+			_scene->_animation[0]->setCurrentFrame(0);
 			break;
 		}
 	}
 
-	if ((_scene->_activeAnimation->getCurrentFrame() == 4) && (_drinkTimer < 10)) {
+	if ((_scene->_animation[0]->getCurrentFrame() == 4) && (_drinkTimer < 10)) {
 		++ _drinkTimer;
-		_scene->_activeAnimation->setCurrentFrame(3);
+		_scene->_animation[0]->setCurrentFrame(3);
 	}
 
 	if (_drinkTimer == 10) {
 		_drinkTimer = 0;
-		_scene->_activeAnimation->setCurrentFrame(4);
-		_scene->_activeAnimation->_currentFrame = 5;
+		_scene->_animation[0]->setCurrentFrame(4);
+		_scene->_animation[0]->_currentFrame = 5;
 	}
 
 
-	switch (_scene->_activeAnimation->getCurrentFrame()) {
+	switch (_scene->_animation[0]->getCurrentFrame()) {
 	case 6:
 	case 10:
 	case 14:
-		_scene->_activeAnimation->setCurrentFrame(0);
+		_scene->_animation[0]->setCurrentFrame(0);
 		break;
 
 	default:
@@ -3126,36 +3126,36 @@ void Scene410::enter() {
 	sceneEntrySound();
 
 	_scene->loadAnimation(Resources::formatName(410, 'r', -1, EXT_AA, ""));
-	_scene->_activeAnimation->_resetFlag = true;
+	_scene->_animation[0]->_resetFlag = true;
 }
 
 void Scene410::step() {
-	if (_scene->_activeAnimation->getCurrentFrame() == 1) {
+	if (_scene->_animation[0]->getCurrentFrame() == 1) {
 		if (_vm->getRandomNumber(1, 30) == 1)
-			_scene->_activeAnimation->setCurrentFrame(2);
+			_scene->_animation[0]->setCurrentFrame(2);
 		else
-			_scene->_activeAnimation->setCurrentFrame(0);
+			_scene->_animation[0]->setCurrentFrame(0);
 	}
 
-	if (_scene->_activeAnimation->getCurrentFrame() == 9) {
+	if (_scene->_animation[0]->getCurrentFrame() == 9) {
 		if (_vm->getRandomNumber(1, 30) == 1)
-			_scene->_activeAnimation->setCurrentFrame(10);
+			_scene->_animation[0]->setCurrentFrame(10);
 		else
-			_scene->_activeAnimation->setCurrentFrame(8);
+			_scene->_animation[0]->setCurrentFrame(8);
 	}
 
-	if (_scene->_activeAnimation->getCurrentFrame() == 5) {
+	if (_scene->_animation[0]->getCurrentFrame() == 5) {
 		if (_vm->getRandomNumber(1, 30) == 1)
-			_scene->_activeAnimation->setCurrentFrame(6);
+			_scene->_animation[0]->setCurrentFrame(6);
 		else
-			_scene->_activeAnimation->setCurrentFrame(4);
+			_scene->_animation[0]->setCurrentFrame(4);
 	}
 
-	if (_scene->_activeAnimation->getCurrentFrame() == 3) {
+	if (_scene->_animation[0]->getCurrentFrame() == 3) {
 		if (_vm->getRandomNumber(1, 2) == 1)
-			_scene->_activeAnimation->setCurrentFrame(4);
+			_scene->_animation[0]->setCurrentFrame(4);
 		else // == 2
-			_scene->_activeAnimation->setCurrentFrame(8);
+			_scene->_animation[0]->setCurrentFrame(8);
 	}
 }
 
@@ -3491,7 +3491,7 @@ void Scene411::handleDialog() {
 			_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
-			_scene->_activeAnimation->setCurrentFrame(_resetFrame);
+			_scene->_animation[0]->setCurrentFrame(_resetFrame);
 		}
 		_scene->_kernelMessages.reset();
 		_newQuantity = computeQuoteAndQuantity();
@@ -3661,16 +3661,16 @@ void Scene411::enter() {
 	}
 
 	_scene->loadAnimation(formAnimName('a', -1));
-	_scene->_activeAnimation->setCurrentFrame(128);
+	_scene->_animation[0]->setCurrentFrame(128);
 
 	_makeMushroomCloud = false;
 	_killRox = false;
 }
 
 void Scene411::step() {
-	if (_scene->_activeAnimation != nullptr) {
-		if (_curAnimationFrame != _scene->_activeAnimation->getCurrentFrame()) {
-			_curAnimationFrame = _scene->_activeAnimation->getCurrentFrame();
+	if (_scene->_animation[0] != nullptr) {
+		if (_curAnimationFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_curAnimationFrame = _scene->_animation[0]->getCurrentFrame();
 			_resetFrame = -1;
 
 			switch (_curAnimationFrame) {
@@ -3738,14 +3738,14 @@ void Scene411::step() {
 				break;
 			}
 
-			if ((_resetFrame >= 0) && (_resetFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(_resetFrame);
+			if ((_resetFrame >= 0) && (_resetFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(_resetFrame);
 				_curAnimationFrame = _resetFrame;
 			}
 		}
 	}
 
-	if (_scene->_activeAnimation->getCurrentFrame() == 86)
+	if (_scene->_animation[0]->getCurrentFrame() == 86)
 		_vm->_sound->command(59);
 }
 
@@ -4113,10 +4113,10 @@ void Scene413::enter() {
 }
 
 void Scene413::step() {
-	if (_scene->_activeAnimation && _scene->_activeAnimation->getCurrentFrame() == 38)
-		_scene->_activeAnimation->setCurrentFrame(37);
+	if (_scene->_animation[0] && _scene->_animation[0]->getCurrentFrame() == 38)
+		_scene->_animation[0]->setCurrentFrame(37);
 
-	if (_scene->_activeAnimation && _scene->_activeAnimation->getCurrentFrame() == 21 && _canMove) {
+	if (_scene->_animation[0] && _scene->_animation[0]->getCurrentFrame() == 21 && _canMove) {
 		_vm->_sound->command(27);
 		_canMove = false;
 	}
diff --git a/engines/mads/nebular/nebular_scenes5.cpp b/engines/mads/nebular/nebular_scenes5.cpp
index 95eb429..092ddeb 100644
--- a/engines/mads/nebular/nebular_scenes5.cpp
+++ b/engines/mads/nebular/nebular_scenes5.cpp
@@ -722,9 +722,9 @@ void Scene504::enter() {
 }
 
 void Scene504::step() {
-	if ((_carAnimationMode == 1) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_carAnimationMode == 1) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
+			_carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame;
 
 			if (_carFrame == 1)
@@ -732,8 +732,8 @@ void Scene504::step() {
 			else
 				nextFrame = -1;
 
-			if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextFrame);
+			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextFrame);
 				_carFrame = nextFrame;
 			}
 		}
@@ -943,15 +943,15 @@ void Scene505::enter() {
 	_game._player._stepEnabled = false;
 	_frame = -1;
 	_scene->loadAnimation(formAnimName('a', -1));
-	_scene->_activeAnimation->setCurrentFrame(86);
+	_scene->_animation[0]->setCurrentFrame(86);
 
 	sceneEntrySound();
 	_vm->_sound->command(16);
 }
 
 void Scene505::step() {
-	if (_frame != _scene->_activeAnimation->getCurrentFrame()) {
-		_frame = _scene->_activeAnimation->getCurrentFrame();
+	if (_frame != _scene->_animation[0]->getCurrentFrame()) {
+		_frame = _scene->_animation[0]->getCurrentFrame();
 		int resetFrame = -1;
 
 		switch (_frame) {
@@ -1088,8 +1088,8 @@ void Scene505::step() {
 			break;
 		}
 
-		if ((resetFrame >= 0) && (resetFrame != _scene->_activeAnimation->getCurrentFrame())) {
-			_scene->_activeAnimation->setCurrentFrame(resetFrame);
+		if ((resetFrame >= 0) && (resetFrame != _scene->_animation[0]->getCurrentFrame())) {
+			_scene->_animation[0]->setCurrentFrame(resetFrame);
 			_frame = resetFrame;
 		}
 	}
@@ -1254,7 +1254,7 @@ void Scene506::step() {
 		switch (_game._trigger) {
 		case 70:
 			_game._player._visible = true;
-			_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+			_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 			_scene->_sequences.addTimer(6, 71);
 			break;
 
@@ -1943,9 +1943,9 @@ void Scene511::enter() {
 }
 
 void Scene511::step() {
-	if ((_lineAnimationMode == 1) && _scene->_activeAnimation) {
-		if (_lineFrame != _scene->_activeAnimation->getCurrentFrame()) {
-			_lineFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_lineAnimationMode == 1) && _scene->_animation[0]) {
+		if (_lineFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_lineFrame = _scene->_animation[0]->getCurrentFrame();
 			int resetFrame = -1;
 
 			if ((_lineAnimationPosition == 2) && (_lineFrame == 14))
@@ -1961,8 +1961,8 @@ void Scene511::step() {
 					resetFrame = 2;
 			}
 
-			if ((resetFrame >= 0) && (resetFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(resetFrame);
+			if ((resetFrame >= 0) && (resetFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(resetFrame);
 				_lineFrame = resetFrame;
 			}
 		}
@@ -1971,7 +1971,7 @@ void Scene511::step() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
-		_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 		_scene->_sequences.addTimer(6, 71);
 		break;
 
@@ -2009,7 +2009,7 @@ void Scene511::preActions() {
 			_scene->loadAnimation(formAnimName('R',2), 1);
 		} else if (_game._trigger == 1) {
 			_game._player._visible = true;
-			_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+			_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 			_game._objects.setRoom(OBJ_FISHING_LINE, 1);
 			_handingLine = false;
 			_game._player._stepEnabled = true;
@@ -2118,8 +2118,8 @@ void Scene511::actions() {
 						_globals[kLineStatus] = 3;
 						_game._player._stepEnabled = true;
 
-						if (_scene->_activeAnimation)
-							_scene->_activeAnimation->eraseSprites();
+						if (_scene->_animation[0])
+							_scene->_animation[0]->eraseSprites();
 						_game._player.update();
 					}
 				}
@@ -2434,8 +2434,8 @@ void Scene512::actions() {
 		_vm->_dialogs->show(51225);
 	else if (_action.isAction(VERB_LOOK, NOUN_PADLOCK_KEY) && _game._objects.isInRoom(OBJ_PADLOCK_KEY))
 		_vm->_dialogs->show(51215);
-	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_ROD) && (!_scene->_activeAnimation ||
-			_scene->_activeAnimation->getCurrentFrame() == 4))
+	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_ROD) && (!_scene->_animation[0] ||
+			_scene->_animation[0]->getCurrentFrame() == 4))
 		_vm->_dialogs->show(51216);
 	else if (_action.isAction(VERB_LOOK, NOUN_SHIPS_WHEEL))
 		_vm->_dialogs->show(51218);
@@ -2570,7 +2570,7 @@ void Scene513::step() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
-		_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 		_scene->_sequences.addTimer(6, 71);
 		break;
 
diff --git a/engines/mads/nebular/nebular_scenes6.cpp b/engines/mads/nebular/nebular_scenes6.cpp
index d97e37e..5b7dae4 100644
--- a/engines/mads/nebular/nebular_scenes6.cpp
+++ b/engines/mads/nebular/nebular_scenes6.cpp
@@ -124,7 +124,7 @@ void Scene601::step() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
-		_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 		_scene->_sequences.addTimer(30, 71);
 		break;
 
@@ -431,7 +431,7 @@ void Scene602::actions() {
 
 		case 1: {
 			_game._player._visible = true;
-			_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+			_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 			_lastSpriteIdx = _globals._spriteIndexes[3];
 			_lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, -1);
 			_scene->_sequences.setDepth(_lastSequenceIdx, 14);
@@ -775,7 +775,7 @@ void Scene604::step() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
-		_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 		_scene->_sequences.addTimer(30, 71);
 		break;
 
@@ -797,9 +797,9 @@ void Scene604::step() {
 		break;
 	}
 
-	if (_monsterActive && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _monsterFrame) {
-			_monsterFrame = _scene->_activeAnimation->getCurrentFrame();
+	if (_monsterActive && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _monsterFrame) {
+			_monsterFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextMonsterFrame = -1;
 
 			switch (_monsterFrame) {
@@ -837,7 +837,7 @@ void Scene604::step() {
 			}
 
 			if ((nextMonsterFrame >= 0) && (nextMonsterFrame != _monsterFrame)) {
-				_scene->_activeAnimation->setCurrentFrame(nextMonsterFrame);
+				_scene->_animation[0]->setCurrentFrame(nextMonsterFrame);
 				_monsterFrame = nextMonsterFrame;
 			}
 		}
@@ -1297,7 +1297,7 @@ void Scene607::step() {
 	switch (_game._trigger) {
 	case 80:
 		_game._player._visible = true;
-		_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 		_scene->_sequences.addTimer(6, 81);
 		break;
 
@@ -1331,7 +1331,7 @@ void Scene607::handleThrowingBone() {
 
 	case 1:
 		_game._player._visible = true;
-		_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 
 		if (_animationMode != 1)
 			_scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, false);
@@ -1605,7 +1605,7 @@ void Scene608::restoreAnimations() {
 		_scene->_sequences.remove(_globals._sequenceIndexes[6]);
 		_scene->_sequences.remove(_globals._sequenceIndexes[7]);
 		_scene->loadAnimation(formAnimName('A', -1));
-		_scene->_activeAnimation->setCurrentFrame(6);
+		_scene->_animation[0]->setCurrentFrame(6);
 	}
 }
 
@@ -1757,7 +1757,7 @@ void Scene608::enter() {
 		int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25));
 		_carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
 		_scene->loadAnimation(formAnimName('A', -1));
-		_scene->_activeAnimation->setCurrentFrame(6);
+		_scene->_animation[0]->setCurrentFrame(6);
 	} else if (_globals[kCarStatus] == CAR_SQUASHES_DOG) {
 		_carMode = 2;
 		_dogDeathMode = 0;
@@ -1927,13 +1927,13 @@ void Scene608::step() {
 		_animationMode = 0;
 	}
 
-	if ((_carMode == 4) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_carMode == 4) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
+			_carFrame = _scene->_animation[0]->getCurrentFrame();
 
 			if (_carFrame == 10) {
 				_game._player._visible = true;
-				_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+				_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 			} else if (_carFrame == 56) {
 				resetDogVariables();
 				_animationMode = 0;
@@ -1942,12 +1942,12 @@ void Scene608::step() {
 		}
 	}
 
-	if ((_carMode == 5) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_carMode == 5) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
+			_carFrame = _scene->_animation[0]->getCurrentFrame();
 			if (_carFrame == 10) {
 				_game._player._visible = true;
-				_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+				_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 			} else if (_carFrame == 52) {
 				resetDogVariables();
 				_animationMode = 0;
@@ -1956,13 +1956,13 @@ void Scene608::step() {
 		}
 	}
 
-	if ((_carMode == 6) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_carMode == 6) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
+			_carFrame = _scene->_animation[0]->getCurrentFrame();
 
 			if (_carFrame == 11) {
 				_game._player._visible = true;
-				_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+				_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 			} else if (_carFrame == 41) {
 				_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 0, 0, 0);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 10, 11);
@@ -2000,9 +2000,9 @@ void Scene608::step() {
 	if (_game._trigger == 112)
 		_dogYelping = false;
 
-	if ((_carMode == 0) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_carMode == 0) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
+			_carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
 			if ((_globals[kCarStatus] == CAR_UP) || (_globals[kCarStatus] == CAR_DOWN)) {
@@ -2015,7 +2015,7 @@ void Scene608::step() {
 					break;
 
 				case 1:
-					if (_scene->_activeAnimation->getCurrentFrame() >= 12) {
+					if (_scene->_animation[0]->getCurrentFrame() >= 12) {
 						nextFrame = 0;
 						_carMoveMode = 0;
 						_globals[kCarStatus] = CAR_UP;
@@ -2023,7 +2023,7 @@ void Scene608::step() {
 					break;
 
 				case 2:
-					if (_scene->_activeAnimation->getCurrentFrame() >= 6) {
+					if (_scene->_animation[0]->getCurrentFrame() >= 6) {
 						nextFrame = 6;
 						_carMoveMode = 0;
 						_globals[kCarStatus] = CAR_DOWN;
@@ -2035,35 +2035,35 @@ void Scene608::step() {
 				}
 			}
 
-			if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextFrame);
+			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextFrame);
 				_carFrame = nextFrame;
 			}
 		}
 	}
 
-	if ((_carMode == 2) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_carMode == 2) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
+			_carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
 			if (_carMoveMode == 0)
 				nextFrame = 28;
-			else if (_scene->_activeAnimation->getCurrentFrame() >= 28) {
+			else if (_scene->_animation[0]->getCurrentFrame() >= 28) {
 				nextFrame = 28;
 				_carMoveMode = 0;
 			}
 
-			if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextFrame);
+			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextFrame);
 				_carFrame = nextFrame;
 			}
 		}
 	}
 
-	if ((_carMode == 3) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_carMode == 3) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
+			_carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
 			if (_resetPositionsFl) {
@@ -2071,22 +2071,22 @@ void Scene608::step() {
 				_carMoveMode = 0;
 			} else if (_carMoveMode == 0)
 				nextFrame = 6;
-			else if (_scene->_activeAnimation->getCurrentFrame() >= 6) {
+			else if (_scene->_animation[0]->getCurrentFrame() >= 6) {
 				nextFrame = 6;
 				_carMoveMode = 0;
 			}
 
-			if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextFrame);
+			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextFrame);
 				_carFrame = nextFrame;
 			}
 		}
 	}
 
 
-	if ((_carMode == 1) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
-			_carFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_carMode == 1) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
+			_carFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
 			if (_resetPositionsFl) {
@@ -2094,13 +2094,13 @@ void Scene608::step() {
 				_carMoveMode = 0;
 			} else if (_carMoveMode == 0)
 				nextFrame = 6;
-			else if (_scene->_activeAnimation->getCurrentFrame() >= 6) {
+			else if (_scene->_animation[0]->getCurrentFrame() >= 6) {
 				nextFrame = 6;
 				_carMoveMode = 0;
 			}
 
-			if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextFrame);
+			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextFrame);
 				_carFrame = nextFrame;
 			}
 		}
@@ -2605,7 +2605,7 @@ void Scene609::step() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
-		_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 		_scene->_sequences.addTimer(6, 71);
 		break;
 
@@ -4145,13 +4145,13 @@ void Scene611::step() {
 			_hermitMovingFl = true;
 	}
 
-	if (_stickFingerFl && (_scene->_activeAnimation->getCurrentFrame() == 47)) {
+	if (_stickFingerFl && (_scene->_animation[0]->getCurrentFrame() == 47)) {
 		_stickFingerFl = false;
 		_hermitMovingFl = true;
 		_hermitMode = 1;
 	}
 
-	if (_scene->_activeAnimation != nullptr && (_scene->_activeAnimation->getCurrentFrame() == 240) && _check1Fl) {
+	if (_scene->_animation[0] != nullptr && (_scene->_animation[0]->getCurrentFrame() == 240) && _check1Fl) {
 		_check1Fl = false;
 		_scene->_kernelMessages.add(Common::Point(33, 88), 0xFDFC, 0, 0, 90, _game.getQuote(0x27E));
 		_scene->_sequences.addTimer(120, 120);
@@ -4240,7 +4240,7 @@ void Scene611::step() {
 		}
 	}
 
-	if (_scene->_activeAnimation != nullptr && _scene->_activeAnimation->getCurrentFrame() == 254)
+	if (_scene->_animation[0] != nullptr && _scene->_animation[0]->getCurrentFrame() == 254)
 		_game._player._stepEnabled = true;
 
 	if (_game._trigger == 110) {
@@ -4266,7 +4266,7 @@ void Scene611::step() {
 	}
 
 	if (_hermitMode == 6) {
-		if ((_scene->_activeAnimation->getCurrentFrame() == 9) && _check1Fl) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 9) && _check1Fl) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[3]);
 			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
@@ -4275,7 +4275,7 @@ void Scene611::step() {
 			_check1Fl = false;
 		}
 
-		if ((_scene->_activeAnimation->getCurrentFrame() == 17) && !_check1Fl) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 17) && !_check1Fl) {
 			_nextFrame = 26;
 			_hermitMode = 4;
 			_check1Fl = true;
@@ -4283,13 +4283,13 @@ void Scene611::step() {
 	}
 
 	if (_hermitMode == 4) {
-		if ((_scene->_activeAnimation->getCurrentFrame() == 33) && _check1Fl) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 33) && _check1Fl) {
 			displayHermitQuestions(_hermitDisplayedQuestion);
 			_nextFrame = 1;
 			_check1Fl = false;
 		}
 
-		if ((_scene->_activeAnimation->getCurrentFrame() == 9) && !_check1Fl) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 9) && !_check1Fl) {
 			_nextFrame = 8;
 			_scene->_sequences.addTimer(1, 113);
 			_check1Fl = true;
@@ -4315,8 +4315,8 @@ void Scene611::step() {
 		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 115);
 	}
 
-	if ((_nextFrame >= 0) && (_nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-		_scene->_activeAnimation->setCurrentFrame(_nextFrame);
+	if ((_nextFrame >= 0) && (_nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+		_scene->_animation[0]->setCurrentFrame(_nextFrame);
 		_nextFrame = -1;
 	}
 
@@ -4588,7 +4588,7 @@ void Scene612::step() {
 	switch (_game._trigger) {
 	case 70:
 		_game._player._visible = true;
-		_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+		_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 		_scene->_sequences.addTimer(6, 71);
 		break;
 
diff --git a/engines/mads/nebular/nebular_scenes7.cpp b/engines/mads/nebular/nebular_scenes7.cpp
index c2a249e..58280a7 100644
--- a/engines/mads/nebular/nebular_scenes7.cpp
+++ b/engines/mads/nebular/nebular_scenes7.cpp
@@ -361,7 +361,7 @@ void Scene701::actions() {
 
 			case 1: {
 				_game._player._visible = true;
-				_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+				_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
 				_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
 				_scene->_sequences.setDepth (_globals._sequenceIndexes[2], 9);
 				int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_CLIMB_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
@@ -694,7 +694,7 @@ void Scene703::enter() {
 		_boatDir = 2;
 		_monsterMode = 0;
 		_scene->loadAnimation(formAnimName('A', -1));
-		_scene->_activeAnimation->setCurrentFrame(34);
+		_scene->_animation[0]->setCurrentFrame(34);
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._stepEnabled = false;
 		_boatDir = 1;
@@ -712,17 +712,17 @@ void Scene703::enter() {
 		_boatDir = 1;
 		_monsterMode = 1;
 		_scene->loadAnimation(formAnimName('B', -1));
-		_scene->_activeAnimation->setCurrentFrame(39);
+		_scene->_animation[0]->setCurrentFrame(39);
 	} else if (_boatDir == 1) {
 		_curSequence = 0;
 		_monsterMode = 0;
 		_scene->loadAnimation(formAnimName('A', -1));
-		_scene->_activeAnimation->setCurrentFrame(9);
+		_scene->_animation[0]->setCurrentFrame(9);
 	} else if (_boatDir == 2) {
 		_curSequence = 0;
 		_monsterMode = 0;
 		_scene->loadAnimation(formAnimName('A', -1));
-		_scene->_activeAnimation->setCurrentFrame(56);
+		_scene->_animation[0]->setCurrentFrame(56);
 	}
 
 	if (_scene->_roomChanged) {
@@ -764,9 +764,9 @@ void Scene703::step() {
 	if (_game._trigger == 70)
 		_scene->_reloadSceneFlag = true;
 
-	if ((_monsterMode == 3) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) {
-			_boatFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_monsterMode == 3) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
+			_boatFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextBoatFrame = -1;
 
 			if (_boatFrame == 62) {
@@ -777,8 +777,8 @@ void Scene703::step() {
 				}
 			}
 
-			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextBoatFrame);
+			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
 				_boatFrame = nextBoatFrame;
 			}
 		}
@@ -787,9 +787,9 @@ void Scene703::step() {
 	if (_game._trigger == 70)
 		_scene->_reloadSceneFlag = true;
 
-	if ((_monsterMode == 0) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) {
-			_boatFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_monsterMode == 0) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
+			_boatFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextBoatFrame = -1;
 
 			switch (_boatFrame) {
@@ -860,8 +860,8 @@ void Scene703::step() {
 				break;
 			}
 
-			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextBoatFrame);
+			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
 				_boatFrame = nextBoatFrame;
 			}
 		}
@@ -895,9 +895,9 @@ void Scene703::step() {
 	}
 
 
-	if ((_monsterMode == 1) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) {
-			_boatFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_monsterMode == 1) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
+			_boatFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextBoatFrame = -1;
 
 			switch (_boatFrame) {
@@ -934,16 +934,16 @@ void Scene703::step() {
 				break;
 			}
 
-			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextBoatFrame);
+			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
 				_boatFrame = nextBoatFrame;
 			}
 		}
 	}
 
-	if ((_monsterMode == 2) && (_scene->_activeAnimation != nullptr)) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) {
-			_boatFrame = _scene->_activeAnimation->getCurrentFrame();
+	if ((_monsterMode == 2) && (_scene->_animation[0] != nullptr)) {
+		if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
+			_boatFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextBoatFrame = -1;
 
 			switch (_boatFrame) {
@@ -983,7 +983,7 @@ void Scene703::step() {
 				_scene->freeAnimation();
 				_monsterMode = 1;
 				_scene->loadAnimation(formAnimName('B', -1));
-				_scene->_activeAnimation->setCurrentFrame(39);
+				_scene->_animation[0]->setCurrentFrame(39);
 				_game._player._stepEnabled = true;
 				break;
 
@@ -992,7 +992,7 @@ void Scene703::step() {
 					_scene->freeAnimation();
 					_monsterMode = 1;
 					_scene->loadAnimation(formAnimName('B', -1));
-					_scene->_activeAnimation->setCurrentFrame(39);
+					_scene->_animation[0]->setCurrentFrame(39);
 					_game._player._stepEnabled = true;
 				} else
 					_game._objects.setRoom(OBJ_CHICKEN_BOMB, 1);
@@ -1005,7 +1005,7 @@ void Scene703::step() {
 				_scene->freeAnimation();
 				_monsterMode = 0;
 				_scene->loadAnimation(formAnimName('A', -1));
-				_scene->_activeAnimation->setCurrentFrame(9);
+				_scene->_animation[0]->setCurrentFrame(9);
 				_game._player._stepEnabled = true;
 				if (_game._storyMode == STORYMODE_NAUGHTY)
 					_vm->_dialogs->show(70321);
@@ -1018,8 +1018,8 @@ void Scene703::step() {
 				break;
 			}
 
-			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextBoatFrame);
+			if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
 				_boatFrame = nextBoatFrame;
 			}
 		}
@@ -1055,7 +1055,7 @@ void Scene703::actions() {
 		_scene->freeAnimation();
 		_monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
-		_scene->_activeAnimation->setCurrentFrame(19);
+		_scene->_animation[0]->setCurrentFrame(19);
 	} else if (_action.isAction(VERB_THROW, NOUN_CHICKEN, NOUN_SEA_MONSTER)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
@@ -1066,13 +1066,13 @@ void Scene703::actions() {
 		_scene->freeAnimation();
 		_monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
-		_scene->_activeAnimation->setCurrentFrame(39);
+		_scene->_animation[0]->setCurrentFrame(39);
 	} else if (_action.isAction(VERB_THROW, NOUN_BOMB, NOUN_SEA_MONSTER)) {
 		_game._player._stepEnabled = false;
 		_scene->freeAnimation();
 		_monsterMode = 2;
 		_scene->loadAnimation(formAnimName('C', -1));
-		_scene->_activeAnimation->setCurrentFrame(59);
+		_scene->_animation[0]->setCurrentFrame(59);
 	} else if (_action.isAction(VERB_THROW, NOUN_CHICKEN_BOMB, NOUN_SEA_MONSTER)) {
 		_useBomb = true;
 		_game._player._stepEnabled = false;
@@ -1241,21 +1241,21 @@ void Scene704::enter() {
 		_animationMode = 2;
 		_boatDirection = 2;
 		_scene->loadAnimation(formAnimName('A', -1));
-		_scene->_activeAnimation->setCurrentFrame(36);
+		_scene->_animation[0]->setCurrentFrame(36);
 	} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
 		_game._player._stepEnabled = false;
 		_boatDirection = 1;
 		_scene->loadAnimation(formAnimName('A', -1));
 	} else if (_boatDirection == 1) {
 		_scene->loadAnimation(formAnimName('A', -1));
-		_scene->_activeAnimation->setCurrentFrame(8);
+		_scene->_animation[0]->setCurrentFrame(8);
 	} else if (_boatDirection == 2) {
 		if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId) {
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(123, 125));
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 		}
 		_scene->loadAnimation(formAnimName('A', -1));
-		_scene->_activeAnimation->setCurrentFrame(57);
+		_scene->_animation[0]->setCurrentFrame(57);
 	}
 
 	if (_scene->_roomChanged)
@@ -1269,9 +1269,9 @@ void Scene704::enter() {
 }
 
 void Scene704::step() {
-	if (_scene->_activeAnimation != nullptr) {
-		if (_scene->_activeAnimation->getCurrentFrame() != _boatCurrentFrame) {
-			_boatCurrentFrame = _scene->_activeAnimation->getCurrentFrame();
+	if (_scene->_animation[0] != nullptr) {
+		if (_scene->_animation[0]->getCurrentFrame() != _boatCurrentFrame) {
+			_boatCurrentFrame = _scene->_animation[0]->getCurrentFrame();
 			int nextFrame = -1;
 
 			switch (_boatCurrentFrame) {
@@ -1377,8 +1377,8 @@ void Scene704::step() {
 				break;
 			}
 
-			if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
-				_scene->_activeAnimation->setCurrentFrame(nextFrame);
+			if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
+				_scene->_animation[0]->setCurrentFrame(nextFrame);
 				_boatCurrentFrame = nextFrame;
 			}
 		}
@@ -1906,9 +1906,9 @@ void Scene706::step() {
 		_scene->_reloadSceneFlag = true;
 	}
 
-	if (_scene->_activeAnimation != nullptr) {
-		if ((_animationMode != 0) && (_scene->_activeAnimation->getCurrentFrame() != _animationFrame)) {
-			_animationFrame = _scene->_activeAnimation->getCurrentFrame();
+	if (_scene->_animation[0] != nullptr) {
+		if ((_animationMode != 0) && (_scene->_animation[0]->getCurrentFrame() != _animationFrame)) {
+			_animationFrame = _scene->_animation[0]->getCurrentFrame();
 
 			if (_animationFrame == 6) {
 				_scene->_sequences.remove(_globals._sequenceIndexes[1]);
diff --git a/engines/mads/nebular/nebular_scenes8.cpp b/engines/mads/nebular/nebular_scenes8.cpp
index a904569..3c5cfe3 100644
--- a/engines/mads/nebular/nebular_scenes8.cpp
+++ b/engines/mads/nebular/nebular_scenes8.cpp
@@ -930,7 +930,7 @@ void Scene804::enter() {
 void Scene804::step() {
 	if (!_messWithThrottle) {
 
-		if ((_throttleGone) && (_movingThrottle) && (_scene->_activeAnimation->getCurrentFrame() == 39)) {
+		if ((_throttleGone) && (_movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 39)) {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startCycle
 				(_globals._spriteIndexes[1], false, 1);
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(133, 139));
@@ -938,7 +938,7 @@ void Scene804::step() {
 			_throttleGone = false;
 		}
 
-		if ((_movingThrottle) && (_scene->_activeAnimation->getCurrentFrame() == 42)) {
+		if ((_movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 42)) {
 			_resetFrame = 0;
 			_movingThrottle = false;
 		}
@@ -947,12 +947,12 @@ void Scene804::step() {
 			_resetFrame = 42;
 		}
 
-		if (_scene->_activeAnimation->getCurrentFrame() == 65)
+		if (_scene->_animation[0]->getCurrentFrame() == 65)
 			_scene->_sequences.remove(_globals._sequenceIndexes[7]);
 
 		switch (_game._storyMode) {
 		case STORYMODE_NAUGHTY:
-			if (_scene->_activeAnimation->getCurrentFrame() == 81) {
+			if (_scene->_animation[0]->getCurrentFrame() == 81) {
 				_resetFrame = 80;
 				_globals[kInSpace] = false;
 				_globals[kBeamIsUp] = true;
@@ -964,7 +964,7 @@ void Scene804::step() {
 			break;
 
 		case STORYMODE_NICE:
-			if (_scene->_activeAnimation->getCurrentFrame() == 68) {
+			if (_scene->_animation[0]->getCurrentFrame() == 68) {
 				_resetFrame = 66;
 				_globals[kInSpace] = false;
 				_globals[kBeamIsUp] = true;
@@ -975,12 +975,12 @@ void Scene804::step() {
 			}
 		}
 
-		if (_scene->_activeAnimation->getCurrentFrame() == 34) {
+		if (_scene->_animation[0]->getCurrentFrame() == 34) {
 			_resetFrame = 36;
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 		}
 
-		if (_scene->_activeAnimation->getCurrentFrame() == 37) {
+		if (_scene->_animation[0]->getCurrentFrame() == 37) {
 			_resetFrame = 36;
 			if (!_dontPullThrottleAgain) {
 				_dontPullThrottleAgain = true;
@@ -992,20 +992,20 @@ void Scene804::step() {
 			_scene->_nextSceneId = 803;
 		}
 
-		if ((_scene->_activeAnimation->getCurrentFrame() == 7) && (!_globals[kWindowFixed])) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 7) && (!_globals[kWindowFixed])) {
 			_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
 			_scene->_sequences.addTimer(20, 110);
 			_globals[kWindowFixed] = true;
 		}
 
-		if (_scene->_activeAnimation->getCurrentFrame() == 10) {
+		if (_scene->_animation[0]->getCurrentFrame() == 10) {
 			_resetFrame = 0;
 			_game._player._stepEnabled = true;
 			_game._objects.setRoom(OBJ_POLYCEMENT, NOWHERE);
 		}
 
 		// FIXME: Original doesn't have resetFrame check. Check why this has been needed
-		if (_resetFrame == -1 &&  _scene->_activeAnimation->getCurrentFrame() == 1) {
+		if (_resetFrame == -1 &&  _scene->_animation[0]->getCurrentFrame() == 1) {
 			int randomVal = _vm->getRandomNumber(29) + 1;
 			switch (randomVal) {
 			case 1:
@@ -1023,7 +1023,7 @@ void Scene804::step() {
 			}
 		}
 
-		switch (_scene->_activeAnimation->getCurrentFrame()) {
+		switch (_scene->_animation[0]->getCurrentFrame()) {
 		case 26:
 		case 28:
 		case 31:
@@ -1031,12 +1031,12 @@ void Scene804::step() {
 			break;
 		}
 	} else {
-		if ((_scene->_activeAnimation->getCurrentFrame() == 36) && (!_throttleGone)) {
+		if ((_scene->_animation[0]->getCurrentFrame() == 36) && (!_throttleGone)) {
 			_scene->_sequences.remove(_globals._sequenceIndexes[1]);
 			_throttleGone = true;
 		}
 
-		if (_scene->_activeAnimation->getCurrentFrame() == 39) {
+		if (_scene->_animation[0]->getCurrentFrame() == 39) {
 			_movingThrottle = false;
 			switch (_throttleCounter) {
 			case 1:
@@ -1074,8 +1074,8 @@ void Scene804::step() {
 	}
 
 	if (_resetFrame >= 0) {
-		if (_resetFrame != _scene->_activeAnimation->getCurrentFrame()) {
-			_scene->_activeAnimation->setCurrentFrame(_resetFrame);
+		if (_resetFrame != _scene->_animation[0]->getCurrentFrame()) {
+			_scene->_animation[0]->setCurrentFrame(_resetFrame);
 			_resetFrame = -1;
 		}
 	}
@@ -1084,12 +1084,12 @@ void Scene804::step() {
 		_scene->_nextSceneId = 803;
 	}
 
-	if ((_scene->_activeAnimation->getCurrentFrame() == 72) && !_alreadyPop) {
+	if ((_scene->_animation[0]->getCurrentFrame() == 72) && !_alreadyPop) {
 		_vm->_sound->command(21);
 		_alreadyPop = true;
 	}
 
-	if ((_scene->_activeAnimation->getCurrentFrame() == 80) && !_alreadyOrgan) {
+	if ((_scene->_animation[0]->getCurrentFrame() == 80) && !_alreadyOrgan) {
 		_vm->_sound->command(22);
 		_alreadyOrgan = true;
 	}
@@ -1606,7 +1606,7 @@ void Scene810::enter() {
 }
 
 void Scene810::step() {
-	if (_scene->_activeAnimation && (_scene->_activeAnimation->getCurrentFrame() == 200) 
+	if (_scene->_animation[0] && (_scene->_animation[0]->getCurrentFrame() == 200) 
 			&& _moveAllowed) {
 		_scene->_sequences.addTimer(100, 70);
 		_moveAllowed = false;
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index ee5f1a5..9eb6a1a 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -49,7 +49,8 @@ Scene::Scene(MADSEngine *vm)
 	_reloadSceneFlag = false;
 	_freeAnimationFlag = false;
 	_animationData = nullptr;
-	_activeAnimation = nullptr;
+	for (int i = 0; i < 10; i++)
+		_animation[i] = nullptr;
 	_textSpacing = -1;
 	_frameStartTime = 0;
 	_mode = SCREENMODE_VGA;
@@ -430,8 +431,10 @@ void Scene::doFrame() {
 				_sequences.tick();
 
 				// Handle any active animation
-				if (_activeAnimation)
-					_activeAnimation->update();
+				for (int i = 0; i < 10; i++) {
+					if (_animation[i])
+						_animation[i]->update();
+				}
 			}
 
 			// If the debugget flag is set, show the mouse position
@@ -480,8 +483,10 @@ void Scene::doFrame() {
 	_vm->_game->_fx = kTransitionNone;
 
 	// Handle freeing animation if necessary
-	if (_activeAnimation && _activeAnimation->freeFlag())
-		_freeAnimationFlag = true;
+	for (int i = 0; i < 10; i++) {
+		if (_animation[i] && _animation[i]->freeFlag())
+			_freeAnimationFlag = true;
+	}
 	if (_freeAnimationFlag)
 		freeAnimation();
 }
@@ -605,19 +610,19 @@ void Scene::checkKeyboard() {
 	}
 }
 
-void Scene::loadAnimation(const Common::String &resName, int trigger) {
+void Scene::loadAnimation(const Common::String &resName, int trigger, int id) {
 	// WORKAROUND: If there's already a previous active animation used by the
 	// scene, then free it before we create the new one
-	if (_activeAnimation)
+	if ((_vm->getGameID() == GType_RexNebular) && _animation[id])
 		freeAnimation();
 
 	DepthSurface depthSurface;
 	UserInterface interfaceSurface(_vm);
 
-	_activeAnimation = Animation::init(_vm, this);
-	_activeAnimation->load(interfaceSurface, depthSurface, resName,
+	_animation[id] = Animation::init(_vm, this);
+	_animation[id]->load(interfaceSurface, depthSurface, resName,
 		_vm->_dithering ? ANIMFLAG_DITHER : 0, nullptr, nullptr);
-	_activeAnimation->startAnimation(trigger);
+	_animation[id]->startAnimation(trigger);
 }
 
 void Scene::updateCursor() {
@@ -658,9 +663,12 @@ void Scene::freeCurrentScene() {
 		delete _animationData;
 		_animationData = nullptr;
 	}
-	if (_activeAnimation) {
-		delete _activeAnimation;
-		_activeAnimation = nullptr;
+
+	for (int i = 0; i < 10; i++) {
+		if (_animation[i]) {
+			delete _animation[i];
+			_animation[i] = nullptr;
+		}
 	}
 
 	_vm->_palette->_paletteUsage.load(nullptr);
@@ -692,30 +700,34 @@ void Scene::resetScene() {
 }
 
 void Scene::freeAnimation() {
-	if (_activeAnimation) {
-		Player &player = _vm->_game->_player;
+	for (int j = 0; j < 10; j++) {
+		if (_animation[j]) {
+			if (j == 0) {
+				Player &player = _vm->_game->_player;
+
+				if (!_freeAnimationFlag) {
+					_spriteSlots.fullRefresh(true);
+					_sequences.scan();
+				}
 
-		if (!_freeAnimationFlag) {
-			_spriteSlots.fullRefresh(true);
-			_sequences.scan();
-		}
+				// Refresh the player
+				if (player._visible) {
+					player._forceRefresh = true;
+					player.update();
+				}
+			}
 
-		// Refresh the player
-		if (player._visible) {
-			player._forceRefresh = true;
-			player.update();
-		}
+			// Remove any kernel messages in use by the animation
+			for (uint i = 0; i < _animation[j]->_messages.size(); ++i) {
+				int msgIndex = _animation[j]->_messages[i]._kernelMsgIndex;
+				if (msgIndex >= 0)
+					_kernelMessages.remove(msgIndex);
+			}
 
-		// Remove any kernel messages in use by the animation
-		for (uint i = 0; i < _activeAnimation->_messages.size(); ++i) {
-			int msgIndex = _activeAnimation->_messages[i]._kernelMsgIndex;
-			if (msgIndex >= 0)
-				_kernelMessages.remove(msgIndex);
+			// Delete the animation
+			delete _animation[j];
+			_animation[j] = nullptr;
 		}
-
-		// Delete the animation
-		delete _activeAnimation;
-		_activeAnimation = nullptr;
 	}
 
 	_freeAnimationFlag = false;
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index c0784c3..a29f8a0 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -111,7 +111,7 @@ public:
 	Common::Array<PaletteCycle> _paletteCycles;
 	Common::StringArray _vocabStrings;
 	Animation *_animationData;
-	Animation *_activeAnimation;
+	Animation *_animation[10];
 	bool _freeAnimationFlag;
 	int _depthStyle;
 	int _bandsRange;
@@ -214,7 +214,7 @@ public:
 	/**
 	 * Load an animation
 	 */
-	void loadAnimation(const Common::String &resName, int trigger = 0);
+	void loadAnimation(const Common::String &resName, int trigger = 0, int id = 0);
 
 	/**
 	 * Returns a vocab entry


Commit: 7fbbf515932a32447fce1c2785936d3f2277bcaa
    https://github.com/scummvm/scummvm/commit/7fbbf515932a32447fce1c2785936d3f2277bcaa
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-09-22T10:39:43+02:00

Commit Message:
MADS: Phantom - Implement Scene1xx functions

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/player.cpp
    engines/mads/player.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 2d991fd..97ff94e 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -31,15 +31,89 @@ namespace MADS {
 namespace Phantom {
 
 void Scene1xx::setAAName() {
-	// TODO
-	//int idx = 0;
-	//_game._aaName = Resources::formatAAName(idx);
+	_game._aaName = Resources::formatAAName(_globals[kTempInterface]);
+	_vm->_palette->setEntry(254, 43, 47, 51);
 }
 
 void Scene1xx::sceneEntrySound() {
-	// TODO
+	if (!_vm->_musicFlag)
+		return;
+
+	if (_globals[kDoneBrieConv203] == 3) {
+		_vm->_sound->command(39);
+	} else {
+		switch (_scene->_nextSceneId) {
+		case 101:
+			if (!_game._visitedScenes._sceneRevisited)
+				_vm->_sound->command(38);
+			else
+				_vm->_sound->command(16);
+			break;
+
+		case 102:
+			if (_scene->_priorSceneId == 104)
+				_vm->_sound->command(27);
+			else
+				_vm->_sound->command(16);
+			break;
+
+		case 103:
+			if ((_globals[kJacquesStatus] == 2)) {
+				_vm->_sound->command(32);
+				_globals[kJacquesStatus] = 3;
+			} else
+				_vm->_sound->command(16);
+			break;
+
+		case 104:
+			if (_scene->_priorSceneId == 301) {
+				warning("TODO: Add check on Conversation restore running == 7");
+				_vm->_sound->command(33);
+			} else if ((_globals[kRoom103104Transition] == 0) && !_globals[kObservedPhan104]) {
+				_vm->_sound->command(37);
+				_globals[kObservedPhan104] = true;
+			} else
+				_vm->_sound->command(16);
+			break;
+
+		case 111:
+			if (_scene->_priorSceneId == 150)
+				_vm->_sound->command(38);
+			else if (_globals[kLeaveAngelMusicOn])
+				_vm->_sound->command(34);
+			else
+				_vm->_sound->command(16);
+			break;
+		case 113:
+			if (_globals[kLeaveAngelMusicOn])
+				_vm->_sound->command(34);
+			else if (_globals[kCurrentYear] == 1993)
+				_vm->_sound->command(36);
+			else
+				_vm->_sound->command(35);
+			break;
+
+		default:
+			if ((_scene->_priorSceneId != 204) && (_scene->_nextSceneId != 150))
+				_vm->_sound->command(16);
+			break;
+		}
+	}
 }
 
+void Scene1xx::setPlayerSpritesPrefix() {
+	_vm->_sound->command(5);
+
+	Common::String oldName = _game._player._spritesPrefix;
+
+	if (!_game._player._forcePrefix)
+		_game._player._spritesPrefix = "RAL";
+
+	if (oldName != _game._player._spritesPrefix)
+		_game._player._spritesChanged = true;
+
+	_game._player._scalingVelocity = true;}
+
 /*------------------------------------------------------------------------*/
 
 Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) {
@@ -48,11 +122,10 @@ Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) {
 
 void Scene101::synchronize(Common::Serializer &s) {
 	Scene1xx::synchronize(s);
-
 }
 
 void Scene101::setup() {
-	//setPlayerSpritesPrefix();
+	setPlayerSpritesPrefix();
 	setAAName();
 }
 
diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index bb747f4..10c93e5 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -80,6 +80,7 @@ Player::Player(MADSEngine *vm)
 	_moving = false;
 	_walkOffScreen = 0;
 	_walkOffScreenSceneId = -1;
+	_forcePrefix = false;
 
 	Common::fill(&_stopWalkerList[0], &_stopWalkerList[12], 0);
 	Common::fill(&_stopWalkerTrigger[0], &_stopWalkerTrigger[12], 0);
diff --git a/engines/mads/player.h b/engines/mads/player.h
index e5765a9..d2cdd47 100644
--- a/engines/mads/player.h
+++ b/engines/mads/player.h
@@ -131,6 +131,7 @@ public:
 	int _trigger;
 	bool _scalingVelocity;
 	bool _forceRefresh;
+	bool _forcePrefix;
 	bool _needToWalk;
 	bool _readyToWalk;
 	int _stopWalkerIndex;


Commit: 3ffa01ec2a4482441f0147c0947a600def0a178b
    https://github.com/scummvm/scummvm/commit/3ffa01ec2a4482441f0147c0947a600def0a178b
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-10T17:32:51+02:00

Commit Message:
MADS: Phantom: Implement Scene101::enter(), add some empty (new) engine functions

Changed paths:
  A engines/mads/conversations.cpp
  A engines/mads/conversations.h
    engines/mads/hotspots.cpp
    engines/mads/hotspots.h
    engines/mads/mads.cpp
    engines/mads/mads.h
    engines/mads/module.mk
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/player.cpp
    engines/mads/player.h
    engines/mads/scene.cpp
    engines/mads/scene.h
    engines/mads/sequence.cpp
    engines/mads/sequence.h



diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp
new file mode 100644
index 0000000..451142a
--- /dev/null
+++ b/engines/mads/conversations.cpp
@@ -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.
+ *
+ */
+
+#include "mads/conversations.h"
+#include "mads/mads.h"
+
+namespace MADS {
+
+GameConversation::GameConversation(MADSEngine *vm)
+	: _vm(vm) {
+	_restoreRunning = 0;
+}
+
+GameConversation::~GameConversation() {
+}
+
+void GameConversation::get(int id) {
+	warning("TODO GameConversation::get");
+}
+
+void GameConversation::run(int id) {
+	warning("TODO GameConversation::run");
+}
+
+void GameConversation::exportPointer(int *val) {
+	warning("TODO GameConversation::exportPointer");
+}
+} // End of namespace MADS
diff --git a/engines/mads/conversations.h b/engines/mads/conversations.h
new file mode 100644
index 0000000..fe128ad
--- /dev/null
+++ b/engines/mads/conversations.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 MADS_CONVERSATIONS_H
+#define MADS_CONVERSATIONS_H
+
+namespace MADS {
+
+class MADSEngine;
+
+class GameConversation {
+private:
+	MADSEngine *_vm;
+
+public:
+	/**
+	 * Constructor
+	 */
+	GameConversation(MADSEngine *vm);
+
+	/**
+	 * Destructor
+	 */
+	virtual ~GameConversation();
+
+	void get(int id);
+	void run(int id);
+	void exportPointer(int *val);
+
+	int _restoreRunning;
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_CONVERSATIONS_H */
diff --git a/engines/mads/hotspots.cpp b/engines/mads/hotspots.cpp
index 8afef2e..2235bf5 100644
--- a/engines/mads/hotspots.cpp
+++ b/engines/mads/hotspots.cpp
@@ -52,6 +52,11 @@ DynamicHotspots::DynamicHotspots(MADSEngine *vm) : _vm(vm) {
 	_count = 0;
 }
 
+int DynamicHotspots::add(int descId, int verbId, int syntax, int seqIndex, const Common::Rect &bounds) {
+	warning("TODO: DynamicHotspots::add(5 params))");
+	return add(descId, verbId, seqIndex, bounds);
+}
+
 int DynamicHotspots::add(int descId, int verbId, int seqIndex, const Common::Rect &bounds) {
 	// Find a free slot
 	uint idx = 0;
diff --git a/engines/mads/hotspots.h b/engines/mads/hotspots.h
index 902275b..12b7e99 100644
--- a/engines/mads/hotspots.h
+++ b/engines/mads/hotspots.h
@@ -56,6 +56,16 @@ public:
 
 #define DYNAMIC_HOTSPOTS_SIZE 8
 
+#define SYNTAX_SINGULAR               0
+#define SYNTAX_PLURAL                 1
+#define SYNTAX_PARTITIVE              2
+#define SYNTAX_SINGULAR_MASC          3
+#define SYNTAX_SINGULAR_FEM           4
+#define SYNTAX_SINGULAR_LIVING        5
+#define SYNTAX_MASC_NOT_PROPER        6
+#define SYNTAX_FEM_NOT_PROPER         7
+#define MAX_SYNTAX                    8
+
 class DynamicHotspots {
 private:
 	MADSEngine *_vm;
@@ -68,6 +78,7 @@ public:
 
 	Common::Array<MADS::DynamicHotspot>::size_type size() const { return _entries.size(); }
 	DynamicHotspot &operator[](uint idx) { return _entries[idx]; }
+	int add(int descId, int verbId, int syntax, int seqIndex, const Common::Rect &bounds);
 	int add(int descId, int verbId, int seqIndex, const Common::Rect &bounds);
 	int setPosition(int index, const Common::Point &pos, Facing facing);
 	int setCursor(int index, CursorType cursor);
diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp
index 8c7b6b1..0bdf484 100644
--- a/engines/mads/mads.cpp
+++ b/engines/mads/mads.cpp
@@ -46,12 +46,14 @@ MADSEngine::MADSEngine(OSystem *syst, const MADSGameDescription *gameDesc) :
 	_musicFlag = true;
 	_soundFlag = true;
 	_dithering = false;
+	_disableFastwalk = false;
 
 	_debugger = nullptr;
 	_dialogs = nullptr;
 	_events = nullptr;
 	_font = nullptr;
 	_game = nullptr;
+	_gameConv = nullptr;
 	_palette = nullptr;
 	_resources = nullptr;
 	_sound = nullptr;
@@ -65,6 +67,7 @@ MADSEngine::~MADSEngine() {
 	delete _font;
 	Font::deinit();
 	delete _game;
+	delete _gameConv;
 	delete _palette;
 	delete _resources;
 	delete _sound;
@@ -96,6 +99,14 @@ void MADSEngine::initialize() {
 	_audio = new AudioPlayer(_mixer, getGameID());
 	_game = Game::init(this);
 
+	switch (getGameID()) {
+	case GType_RexNebular:
+		_gameConv = nullptr;
+		break;
+	default:
+		_gameConv = new GameConversation(this);
+	}
+
 	loadOptions();
 
 	_screen.empty();
diff --git a/engines/mads/mads.h b/engines/mads/mads.h
index 9010353..1b0f96a 100644
--- a/engines/mads/mads.h
+++ b/engines/mads/mads.h
@@ -30,6 +30,7 @@
 #include "common/util.h"
 #include "engines/engine.h"
 #include "graphics/surface.h"
+#include "mads/conversations.h"
 #include "mads/debugger.h"
 #include "mads/dialogs.h"
 #include "mads/events.h"
@@ -96,6 +97,7 @@ public:
 	EventsManager *_events;
 	Font *_font;
 	Game *_game;
+	GameConversation * _gameConv;
 	Palette *_palette;
 	Resources *_resources;
 	ScreenSurface _screen;
@@ -108,6 +110,7 @@ public:
 	bool _musicFlag;
 	bool _soundFlag;
 	bool _dithering;
+	bool _disableFastwalk;
 public:
 	MADSEngine(OSystem *syst, const MADSGameDescription *gameDesc);
 	virtual ~MADSEngine();
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 7cb7a91..9c79068 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -26,6 +26,7 @@ MODULE_OBJS := \
 	assets.o \
 	audio.o \
 	compression.o \
+	conversations.o \
 	debugger.o \
 	detection.o \
 	dialogs.o \
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 97ff94e..e47505d 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -22,6 +22,7 @@
 
 #include "common/scummsys.h"
 #include "mads/mads.h"
+#include "mads/conversations.h"
 #include "mads/scene.h"
 #include "mads/phantom/phantom_scenes.h"
 #include "mads/phantom/phantom_scenes1.h"
@@ -117,30 +118,129 @@ void Scene1xx::setPlayerSpritesPrefix() {
 /*------------------------------------------------------------------------*/
 
 Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) {
-
+	_execute_chan = -1;
+	_execute_wipe = -1;
+	_brie_calling_position = -1;
+	_brie_chandelier_position = -1;
+	_brie_calling_frame = -1;
+	_brie_chandelier_frame = -1;
+	_talk_count = -1;
+	_dynamic_brie = 0;
+	_dynamic_brie_2 = 0;
+	_start_walking = false;
+	_start_walking_0 = false;
+	_anim_0_running = false;
+	_anim_1_running = false;
+	_start_sitting_down = false;
 }
 
 void Scene101::synchronize(Common::Serializer &s) {
 	Scene1xx::synchronize(s);
+	s.syncAsSint16LE(_execute_chan);
+	s.syncAsSint16LE(_execute_wipe);
+	s.syncAsSint16LE(_brie_calling_position);
+	s.syncAsSint16LE(_brie_chandelier_position);
+	s.syncAsSint16LE(_brie_calling_frame);
+	s.syncAsSint16LE(_brie_chandelier_frame);
+	s.syncAsSint16LE(_talk_count);
+	s.syncAsSint16LE(_dynamic_brie);
+	s.syncAsSint16LE(_dynamic_brie_2);
+	s.syncAsByte(_start_walking);
+	s.syncAsByte(_start_walking_0);
+	s.syncAsByte(_anim_0_running);
+	s.syncAsByte(_anim_1_running);
+	s.syncAsByte(_start_sitting_down);
 }
 
 void Scene101::setup() {
 	setPlayerSpritesPrefix();
 	setAAName();
+	_scene->addActiveVocab(NOUN_MONSIEUR_BRIE);
 }
 
 void Scene101::enter() {
-	// TODO
+	_vm->_disableFastwalk = true;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
+		_execute_chan         = -1;
+		_execute_wipe         = -1;
+		_start_walking        = false;
+		_start_walking_0      = false;
+		_anim_0_running       = true;
+		_anim_1_running       = false;
+		_start_sitting_down = false;
+	}
+
+	// Load Dialogs
+	_vm->_gameConv->get(0);
+	_vm->_gameConv->get(1);
 
 	if (_globals[kCurrentYear] == 1993) {
 		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
-		// TODO
-		//_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 	} else {
-		// TODO
+		_scene->_hotspots.activate(NOUN_CHANDELIER, false);
 	}
 
-	// TODO
+	if (_globals[kBrieTalkStatus] == 0) {
+		_game._player.firstWalk(Common::Point(-20, 75), FACING_EAST, Common::Point(18, 79), FACING_EAST, true);
+		_brie_calling_position = 0;
+		_brie_chandelier_position = 3;
+		_game._player.setWalkTrigger(50);
+
+		_scene->loadAnimation(formAnimName('b', 9), 1, 1);
+		_scene->loadAnimation(formAnimName('b', 8), 1, 0);
+
+		_anim_0_running  = true;
+		_anim_1_running  = true;
+
+		_dynamic_brie = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[_dynamic_brie]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_dynamic_brie, Common::Point(490, 119), FACING_NONE);
+		_scene->setDynamicAnim(_dynamic_brie, 0, 0);
+		_scene->setDynamicAnim(_dynamic_brie, 0, 1);
+		_scene->setDynamicAnim(_dynamic_brie, 0, 2);
+		_scene->setDynamicAnim(_dynamic_brie, 0, 3);
+		_scene->setDynamicAnim(_dynamic_brie, 0, 4);
+
+		_dynamic_brie_2 = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[_dynamic_brie_2]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_dynamic_brie_2, Common::Point(25, 80), FACING_NONE);
+		_scene->setDynamicAnim(_dynamic_brie_2, 1, 1);
+		_scene->setDynamicAnim(_dynamic_brie_2, 1, 2);
+
+		_talk_count = 0;
+	} else if (_globals[kBrieTalkStatus] == 1) {
+		_scene->loadAnimation(formAnimName('b', 9), 1, 1);
+		_dynamic_brie = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[_dynamic_brie]._articleNumber = PREP_ON;
+		_scene->setDynamicAnim(_dynamic_brie, 1, 1);
+		_scene->setDynamicAnim(_dynamic_brie, 1, 2);
+		_anim_1_running = true;
+		_talk_count = 0;
+		_brie_chandelier_position = 3;
+
+		if (_vm->_gameConv->_restoreRunning == 1) {
+			_vm->_gameConv->run(1);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_brie_chandelier_position = 4;
+			if (_scene->_animation[1])
+				_scene->_animation[1]->setCurrentFrame(25);
+		}
+	} else {
+		if (_scene->_priorSceneId == 202) {
+			if (_globals[kJacquesStatus] == 1)
+				_globals[kJacquesStatus] = 2;
+
+			_game._player.firstWalk(Common::Point(-20, 75), FACING_EAST, Common::Point(18, 79), FACING_EAST, true);
+		} else if ((_scene->_priorSceneId == 102) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+			_game._player.firstWalk(Common::Point(655, 130), FACING_WEST, Common::Point(625, 127), FACING_WEST, true);
+			_scene->setCamera(Common::Point(320, 0));
+		}
+	}
+
+	sceneEntrySound();
 }
 
 void Scene101::step() {
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 0f5f56a..60cb63b 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -55,8 +55,20 @@ public:
 
 class Scene101 : public Scene1xx {
 private:
-	// TODO
-
+	int _execute_chan;
+	int _execute_wipe;
+	int _brie_calling_position;
+	int _brie_chandelier_position;
+	int _brie_calling_frame;
+	int _brie_chandelier_frame;
+	int _talk_count;
+	int _dynamic_brie;
+	int _dynamic_brie_2;
+	bool _start_walking;
+	bool _start_walking_0;
+	bool _anim_0_running;
+	bool _anim_1_running;
+	bool _start_sitting_down;
 public:
 	Scene101(MADSEngine *vm);
 	virtual void synchronize(Common::Serializer &s);
diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index 10c93e5..ce8ab37 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -81,6 +81,8 @@ Player::Player(MADSEngine *vm)
 	_walkOffScreen = 0;
 	_walkOffScreenSceneId = -1;
 	_forcePrefix = false;
+	_commandsAllowed = false;
+	_enableAtTarget = false;
 
 	Common::fill(&_stopWalkerList[0], &_stopWalkerList[12], 0);
 	Common::fill(&_stopWalkerTrigger[0], &_stopWalkerTrigger[12], 0);
@@ -798,4 +800,18 @@ void Player::removePlayerSprites() {
 	_visible = false;
 }
 
+void Player::firstWalk(Common::Point fromPos, Facing fromFacing, Common::Point destPos, Facing destFacing, bool enableFl) {
+	_playerPos = fromPos;
+	_facing = fromFacing;
+
+	walk(destPos, destFacing);
+	_walkAnywhere = true;
+
+	_commandsAllowed = false;
+	_enableAtTarget = enableFl;
+}
+
+void Player::setWalkTrigger(int val) {
+	warning("TODO: Player::setWalkTrigger");
+}
 } // End of namespace MADS
diff --git a/engines/mads/player.h b/engines/mads/player.h
index d2cdd47..d4b703f 100644
--- a/engines/mads/player.h
+++ b/engines/mads/player.h
@@ -134,6 +134,8 @@ public:
 	bool _forcePrefix;
 	bool _needToWalk;
 	bool _readyToWalk;
+	bool _commandsAllowed;
+	bool _enableAtTarget;
 	int _stopWalkerIndex;
 	int _centerOfGravity;
 	int _currentDepth;
@@ -222,6 +224,10 @@ public:
 	}
 
 	void removePlayerSprites();
+
+	void firstWalk(Common::Point fromPos, Facing fromFacing, Common::Point destPos, Facing destFacing, bool enableFl);
+
+	void setWalkTrigger(int val);
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 9eb6a1a..b02c57e 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -744,4 +744,11 @@ void Scene::synchronize(Common::Serializer &s) {
 	_dynamicHotspots.synchronize(s);
 }
 
+void Scene::setDynamicAnim(int id, int anim_id, int segment) {
+	warning("TODO: Scene::setDynamicAnim");
+}
+
+void Scene::setCamera(Common::Point pos) {
+	warning("TODO: Scene::setCamera");
+}
 } // End of namespace MADS
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index a29f8a0..ba37b97 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -248,6 +248,9 @@ public:
 	* Synchronize the game
 	*/
 	void synchronize(Common::Serializer &s);
+
+	void setDynamicAnim(int id, int anim_id, int segment);
+	void setCamera(Common::Point pos);
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index e5bf163..dc67006 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -550,4 +550,9 @@ void SequenceList::setMotion(int seqIndex, int flags, int deltaX, int deltaY) {
 	se._posAccum.x = se._posAccum.y = 0;
 }
 
+int SequenceList::addStampCycle(int srcSpriteIdx, bool flipped, int sprite) {
+	warning("TODO: SequenceList::addStampCycle");
+	return -1;
+}
+
 } // End of namespace
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
index c3a277c..df49170 100644
--- a/engines/mads/sequence.h
+++ b/engines/mads/sequence.h
@@ -125,6 +125,8 @@ public:
 	void setMsgLayout(int seqIndex);
 	void setDone(int seqIndex);
 	void setMotion(int seqIndex, int flags, int deltaX, int deltaY);
+
+	int addStampCycle(int srcSpriteIdx, bool flipped, int sprite);
 };
 
 } // End of namespace MADS


Commit: 692e45a6e682c16831fac3d5b00b38863ec5683a
    https://github.com/scummvm/scummvm/commit/692e45a6e682c16831fac3d5b00b38863ec5683a
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-10T18:10:11+02:00

Commit Message:
MADS: Phantom: Add a check on conversation restore in scene 1XX, rework some checks

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index e47505d..2891ffa 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -67,10 +67,9 @@ void Scene1xx::sceneEntrySound() {
 			break;
 
 		case 104:
-			if (_scene->_priorSceneId == 301) {
-				warning("TODO: Add check on Conversation restore running == 7");
+			if ((_vm->_gameConv->_restoreRunning == 7) || (_scene->_priorSceneId == 301)) {
 				_vm->_sound->command(33);
-			} else if ((_globals[kRoom103104Transition] == 0) && !_globals[kObservedPhan104]) {
+			} else if (!_globals[kRoom103104Transition] && !_globals[kObservedPhan104]) {
 				_vm->_sound->command(37);
 				_globals[kObservedPhan104] = true;
 			} else
@@ -228,16 +227,13 @@ void Scene101::enter() {
 			if (_scene->_animation[1])
 				_scene->_animation[1]->setCurrentFrame(25);
 		}
-	} else {
-		if (_scene->_priorSceneId == 202) {
-			if (_globals[kJacquesStatus] == 1)
-				_globals[kJacquesStatus] = 2;
-
-			_game._player.firstWalk(Common::Point(-20, 75), FACING_EAST, Common::Point(18, 79), FACING_EAST, true);
-		} else if ((_scene->_priorSceneId == 102) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
-			_game._player.firstWalk(Common::Point(655, 130), FACING_WEST, Common::Point(625, 127), FACING_WEST, true);
-			_scene->setCamera(Common::Point(320, 0));
-		}
+	} else if (_scene->_priorSceneId == 202) {
+		if (_globals[kJacquesStatus] == 1)
+			_globals[kJacquesStatus] = 2;
+		_game._player.firstWalk(Common::Point(-20, 75), FACING_EAST, Common::Point(18, 79), FACING_EAST, true);
+	} else if ((_scene->_priorSceneId == 102) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player.firstWalk(Common::Point(655, 130), FACING_WEST, Common::Point(625, 127), FACING_WEST, true);
+		_scene->setCamera(Common::Point(320, 0));
 	}
 
 	sceneEntrySound();


Commit: 12a1393faf585b131701602d633edf07f07186dd
    https://github.com/scummvm/scummvm/commit/12a1393faf585b131701602d633edf07f07186dd
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-12T10:53:46+02:00

Commit Message:
MADS: Phantom: Add some more logic for scene 101

Changed paths:
    engines/mads/conversations.cpp
    engines/mads/conversations.h
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/scene.cpp
    engines/mads/scene.h



diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp
index 451142a..8981578 100644
--- a/engines/mads/conversations.cpp
+++ b/engines/mads/conversations.cpp
@@ -27,7 +27,7 @@ namespace MADS {
 
 GameConversation::GameConversation(MADSEngine *vm)
 	: _vm(vm) {
-	_restoreRunning = 0;
+	_running = _restoreRunning = 0;
 }
 
 GameConversation::~GameConversation() {
@@ -41,7 +41,19 @@ void GameConversation::run(int id) {
 	warning("TODO GameConversation::run");
 }
 
+void GameConversation::stop() {
+	warning("TODO GameConversation::stop");
+}
+
 void GameConversation::exportPointer(int *val) {
 	warning("TODO GameConversation::exportPointer");
 }
+
+void GameConversation::setHeroTrigger(int val) {
+	warning("TODO: GameConversation::setHeroTrigger");
+}
+
+void GameConversation::setInterlocutorTrigger(int val) {
+	warning("TODO: GameConversation::setInterlocutorTrigger");
+}
 } // End of namespace MADS
diff --git a/engines/mads/conversations.h b/engines/mads/conversations.h
index fe128ad..9e25eb9 100644
--- a/engines/mads/conversations.h
+++ b/engines/mads/conversations.h
@@ -44,8 +44,12 @@ public:
 
 	void get(int id);
 	void run(int id);
+	void stop();
 	void exportPointer(int *val);
+	void setHeroTrigger(int val);
+	void setInterlocutorTrigger(int val);
 
+	int _running;
 	int _restoreRunning;
 };
 
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 2891ffa..cb36be1 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -123,6 +123,7 @@ Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) {
 	_brie_chandelier_position = -1;
 	_brie_calling_frame = -1;
 	_brie_chandelier_frame = -1;
+	_converse_counter = 0;
 	_talk_count = -1;
 	_dynamic_brie = 0;
 	_dynamic_brie_2 = 0;
@@ -141,6 +142,7 @@ void Scene101::synchronize(Common::Serializer &s) {
 	s.syncAsSint16LE(_brie_chandelier_position);
 	s.syncAsSint16LE(_brie_calling_frame);
 	s.syncAsSint16LE(_brie_chandelier_frame);
+	s.syncAsSint16LE(_converse_counter);
 	s.syncAsSint16LE(_talk_count);
 	s.syncAsSint16LE(_dynamic_brie);
 	s.syncAsSint16LE(_dynamic_brie_2);
@@ -161,12 +163,9 @@ void Scene101::enter() {
 	_vm->_disableFastwalk = true;
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
-		_execute_chan         = -1;
-		_execute_wipe         = -1;
-		_start_walking        = false;
-		_start_walking_0      = false;
-		_anim_0_running       = true;
-		_anim_1_running       = false;
+		_execute_chan = _execute_wipe = -1;
+		_start_walking = _start_walking_0 = false;
+		_anim_0_running = _anim_1_running = false;
 		_start_sitting_down = false;
 	}
 
@@ -240,32 +239,80 @@ void Scene101::enter() {
 }
 
 void Scene101::step() {
-	// TODO
+	if (_anim_0_running)
+		handleAnimation0();
+
+	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
+		++_converse_counter;
+		if (_converse_counter > 200)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+
+	if (_anim_1_running) {
+		handleAnimation1();
+
+		if (_scene->_animation[1]->getCurrentFrame() == 80) {
+			_game._player._stepEnabled = true;
+			_game._player.setWalkTrigger(55);
+		}
+	}
+
+	if (!_start_sitting_down && (_globals[kBrieTalkStatus] != 2)) {
+		warning("TODO: Add a check on view port x > 200");
+		_start_sitting_down = true;
+		_game._player.walk(Common::Point(490, 119), FACING_NORTHEAST);
+		_game._player._stepEnabled = false;
+		_game._player.setWalkTrigger(55);
+		_brie_chandelier_position = 4;
+	}
+
+	if (_game._trigger == 55) {
+		_game._player._stepEnabled = true;
+		_vm->_gameConv->run(1);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_brie_chandelier_frame = -1;
+		_talk_count = 0;
+	}
+
+	if (_game._trigger == 50) {
+		_vm->_gameConv->run(0);
+		_brie_calling_position = 1;
+	}
 }
 
 void Scene101::preActions() {
 	if (_action.isAction(VERB_EXIT_TO, NOUN_ORCHESTRA_PIT)) {
-		// TODO: Handle Brie
-		_game._player._walkOffScreenSceneId = 102;
+		if ((_globals[kBrieTalkStatus] == 2) || _start_walking) {
+			_game._player._walkOffScreenSceneId = 102;
+			_globals[kBrieTalkStatus] = 2;
+		} else {
+			_vm->_gameConv->run(0);
+			_game._player._needToWalk = false;
+		}
 	} else if (_action.isAction(VERB_EXIT_TO, NOUN_GRAND_FOYER)) {
-		// TODO: Handle Brie
-		_game._player._walkOffScreenSceneId = 202;
-	} else if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE)) {
-		_vm->_dialogs->show(10121);
-	} else if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE)) {
-		if (_globals[kBrieTalkStatus] == 2)
+		if ((_globals[kBrieTalkStatus] == 2) || _start_walking)
+			_game._player._walkOffScreenSceneId = 202;
+		else {
+			_vm->_gameConv->run(0);
 			_game._player._needToWalk = false;
-	}
-
-	// TODO
+		}
+	} else if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE))
+		_vm->_dialogs->show(10121);
+	else if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE) && (_globals[kBrieTalkStatus] == 2))
+		_game._player._needToWalk = false;
 }
 
 void Scene101::actions() {
-	// TODO: Brie conversation
-
-	// TODO: Look around
-
-	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+	if (_vm->_gameConv->_running == 0)
+		handleConversation0();
+	else if (_vm->_gameConv->_running == 1)
+		handleConversation1();
+	else if (_action._lookFlag) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(10110);
+		else
+			_vm->_dialogs->show(10111);
+	} else if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
 		if (_action.isObject(NOUN_AISLE)) {
 			_vm->_dialogs->show(10112);
 		} else if (_action.isObject(NOUN_CHANDELIER)) {
@@ -275,8 +322,10 @@ void Scene101::actions() {
 		} else if (_action.isObject(NOUN_SIDE_WALL)) {
 			_vm->_dialogs->show(10115);
 		} else if (_action.isObject(NOUN_SEATS)) {
-			// TODO: Finish this
-			_vm->_dialogs->show(10116);
+			if ((_globals[kBrieTalkStatus] > 1) || _start_walking)
+				_vm->_dialogs->show(10119);
+			else
+				_vm->_dialogs->show(10116);
 		} else if (_action.isObject(NOUN_GRAND_FOYER)) {
 			_vm->_dialogs->show(10117);
 		} else if (_action.isObject(NOUN_ORCHESTRA_PIT)) {
@@ -284,14 +333,273 @@ void Scene101::actions() {
 		} else if (_action.isObject(NOUN_MONSIEUR_BRIE)) {
 			_vm->_dialogs->show(10120);
 		}
-
-		_game._player._stepEnabled = true;
 	} else if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE)) {
 		if (_globals[kBrieTalkStatus] == 2)
 			_vm->_dialogs->show(10122);
-		_game._player._stepEnabled = true;
-	} else if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE)) {
-		_game._player._stepEnabled = true;
+	} else if (!_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE))
+		return;
+
+	_action._inProgress = false;
+}
+
+void Scene101::handleConversation0() {
+	_vm->_gameConv->setHeroTrigger(90);
+
+	if (_game._trigger == 90) {
+		_globals[kBrieTalkStatus] = 1;
+		_start_walking_0 = true;
+	}  
+}
+
+void Scene101::handleConversation1() {
+	if ((_action._activeAction._verbId >= 0) && (_action._activeAction._verbId <= 27)) {
+		int interlocutorFl = false;
+
+		if (_game._trigger == 60) {
+			switch (_action._activeAction._verbId) {
+			case 0:
+				_brie_chandelier_position = 6;
+				_execute_wipe = 2;
+				break;
+
+			case 1:
+				_brie_chandelier_position = 2;
+				_execute_chan = 9;
+				break;
+
+			case 4:
+				_brie_chandelier_position = 0;
+				_execute_chan = -1;
+				_execute_wipe = -1;
+				break;
+
+			case 8:
+			case 10:
+			case 18:
+			case 22:
+			case 24:
+				_start_walking = true;
+				_execute_chan = -1;
+				_execute_wipe = -1;
+				_globals[kWalkerConverse] = 0;
+				_vm->_gameConv->setInterlocutorTrigger(105);
+				interlocutorFl = true;
+				break;
+
+			case 12:
+				_brie_chandelier_position = 5;
+				_execute_chan = -1;
+				_execute_wipe = -1;
+				break;
+
+			default:
+				break;
+			}
+		}
+
+		if (!interlocutorFl)
+			_vm->_gameConv->setInterlocutorTrigger(60);
+
+		_vm->_gameConv->setHeroTrigger(70);
+
+		_talk_count = 0;
+
+		if (_game._trigger == 60) {
+			if (!_start_walking)
+				_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+
+			_brie_chandelier_position = 2;
+		} else if ((_game._trigger == 70) && !_start_walking) {
+			_brie_chandelier_position = 4;
+			_execute_chan = -1;
+			_execute_wipe = -1;
+			if (!_start_walking)
+				_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+
+			_converse_counter = 0;
+		}
+	}
+}
+
+void Scene101::handleAnimation0() {
+	int random;
+	int reset_frame;
+
+	if (_scene->_animation[0]->getCurrentFrame() != _brie_calling_frame) {
+		_brie_calling_frame = _scene->_animation[0]->getCurrentFrame();
+		reset_frame = -1;
+		switch (_brie_calling_frame) {
+		case 1:
+		case 9:
+		case 12:
+			if (_brie_calling_position == 1) {
+				if (_brie_calling_frame == 9) {
+					if (_start_walking_0) {
+						reset_frame = 13;
+						_brie_calling_position = 3;
+					} else
+						_brie_calling_position = 2;
+				} else
+					reset_frame = 1;
+			}
+
+			if (_brie_calling_position == 0) {
+				if (_start_walking_0) {
+					reset_frame = 60;
+					_brie_calling_position = 3;
+				} else
+					reset_frame = 0;
+			}
+
+			if (_brie_calling_position == 2) {
+				if (_start_walking_0) {
+					reset_frame = 13;
+					_brie_calling_position = 3;
+				} else {
+					random = _vm->getRandomNumber(1, 2);
+					++_talk_count;
+
+					if (_talk_count < 18) {
+						if (random == 1)
+							reset_frame = 7;
+						else
+							reset_frame = 10;
+					} else {
+						reset_frame = 54;
+						_brie_calling_position = 0;
+					}
+				}
+			}
+			break;
+
+		case 53:
+			_anim_0_running    = false;
+			_scene->freeAnimation(0);
+			break;
+
+		case 59:  
+			if (_start_walking_0) {
+				reset_frame = 60;
+				_brie_calling_position = 3;
+			} else {
+				reset_frame = 0;
+				_brie_calling_position = 0;
+			}
+			break;
+
+		case 66:
+			reset_frame = 24;
+			break;
+		}
+
+		if (reset_frame >= 0) {
+			if (_scene->_animation[0])
+				_scene->_animation[0]->setCurrentFrame(reset_frame);
+			_brie_calling_frame = reset_frame;
+		}
+	}
+} 
+
+void Scene101::handleAnimation1() {
+	int random;
+	int reset_frame;
+
+	if (_scene->_animation[1]->getCurrentFrame() != _brie_chandelier_frame) {
+		_brie_chandelier_frame = _scene->_animation[1]->getCurrentFrame();
+		reset_frame = -1;
+		switch (_brie_chandelier_frame) {
+		case 1:
+			if (_brie_chandelier_position == 3)
+				reset_frame = 0;
+			break;
+
+		case 11:
+		case 14:
+		case 17:
+		case 19:
+		case 26:
+		case 44:
+		case 333:
+			if (_talk_count == _execute_chan) {
+				_brie_chandelier_position = 0;
+				++_talk_count;
+				_execute_chan = -1;
+			} 
+
+			if (_talk_count == _execute_wipe) {
+				_brie_chandelier_position = 6;
+				++_talk_count;
+				_execute_wipe = -1;
+			}
+
+			if (_start_walking) {
+				if (_vm->_gameConv->_running == 1) {
+					if (_talk_count > 13)
+						_brie_chandelier_position = 1;
+				} else
+					_brie_chandelier_position = 1;
+			}
+
+			switch (_brie_chandelier_position) {
+			case 0:
+				reset_frame = 27;
+				_brie_chandelier_position = 2;
+				break;
+
+			case 1:
+				_globals[kBrieTalkStatus] = 2;
+				reset_frame = 45;
+				if (_vm->_gameConv->_running == 1)
+					_vm->_gameConv->stop();
+				_scene->_dynamicHotspots.remove(_dynamic_brie);
+				_game._player._stepEnabled = false;
+				break;
+
+			case 2:
+				random = _vm->getRandomNumber(1, 3);
+				++_talk_count;
+				if (_talk_count < 15) {
+					if (random == 1)
+						reset_frame = 12;
+					else if (random == 2)
+						reset_frame = 14;
+					else if (random == 3)
+						reset_frame = 17;
+				} else {
+					_brie_chandelier_position = 4;
+					reset_frame = 25;
+				}
+				break;
+
+			case 4:
+				reset_frame = 25;
+				break;
+
+			case 5:
+				reset_frame = 21;
+				_brie_chandelier_position = 2;
+				break;
+
+			case 6:
+				reset_frame = 316;
+				_brie_chandelier_position = 2;
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		case 315:
+			_scene->freeAnimation(1);
+			break;
+		}
+
+		if (reset_frame >= 0) {
+			if (_scene->_animation[1])
+				_scene->_animation[1]->setCurrentFrame(reset_frame);
+			_brie_chandelier_frame = reset_frame;
+		}
 	}
 }
 
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 60cb63b..bd5a479 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -62,6 +62,7 @@ private:
 	int _brie_calling_frame;
 	int _brie_chandelier_frame;
 	int _talk_count;
+	int _converse_counter;
 	int _dynamic_brie;
 	int _dynamic_brie_2;
 	bool _start_walking;
@@ -78,6 +79,11 @@ public:
 	virtual void step();
 	virtual void preActions();
 	virtual void actions();
+
+	void handleConversation0();
+	void handleConversation1();
+	void handleAnimation0();
+	void handleAnimation1();
 };
 
 class Scene102 : public Scene1xx {
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index b02c57e..b02c251 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -614,7 +614,7 @@ void Scene::loadAnimation(const Common::String &resName, int trigger, int id) {
 	// WORKAROUND: If there's already a previous active animation used by the
 	// scene, then free it before we create the new one
 	if ((_vm->getGameID() == GType_RexNebular) && _animation[id])
-		freeAnimation();
+		freeAnimation(id);
 
 	DepthSurface depthSurface;
 	UserInterface interfaceSurface(_vm);
@@ -700,37 +700,40 @@ void Scene::resetScene() {
 }
 
 void Scene::freeAnimation() {
-	for (int j = 0; j < 10; j++) {
-		if (_animation[j]) {
-			if (j == 0) {
-				Player &player = _vm->_game->_player;
-
-				if (!_freeAnimationFlag) {
-					_spriteSlots.fullRefresh(true);
-					_sequences.scan();
-				}
+	for (int j = 0; j < 10; j++)
+		freeAnimation(j);
 
-				// Refresh the player
-				if (player._visible) {
-					player._forceRefresh = true;
-					player.update();
-				}
+	_freeAnimationFlag = false;
+}
+
+void Scene::freeAnimation(int idx) {
+	if (_animation[idx]) {
+		if (idx == 0) {
+			Player &player = _vm->_game->_player;
+
+			if (!_freeAnimationFlag) {
+				_spriteSlots.fullRefresh(true);
+				_sequences.scan();
 			}
 
-			// Remove any kernel messages in use by the animation
-			for (uint i = 0; i < _animation[j]->_messages.size(); ++i) {
-				int msgIndex = _animation[j]->_messages[i]._kernelMsgIndex;
-				if (msgIndex >= 0)
-					_kernelMessages.remove(msgIndex);
+			// Refresh the player
+			if (player._visible) {
+				player._forceRefresh = true;
+				player.update();
 			}
+		}
 
-			// Delete the animation
-			delete _animation[j];
-			_animation[j] = nullptr;
+		// Remove any kernel messages in use by the animation
+		for (uint i = 0; i < _animation[idx]->_messages.size(); ++i) {
+			int msgIndex = _animation[idx]->_messages[i]._kernelMsgIndex;
+			if (msgIndex >= 0)
+				_kernelMessages.remove(msgIndex);
 		}
-	}
 
-	_freeAnimationFlag = false;
+		// Delete the animation
+		delete _animation[idx];
+		_animation[idx] = nullptr;
+	}
 }
 
 void Scene::synchronize(Common::Serializer &s) {
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index ba37b97..d89cbb8 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -245,6 +245,11 @@ public:
 	void freeAnimation();
 
 	/**
+	 * Frees any given active animation for the scene
+	 */
+	void freeAnimation(int idx);
+
+	/**
 	* Synchronize the game
 	*/
 	void synchronize(Common::Serializer &s);


Commit: c275e304df97260ca79b5c2ca2b64e4de3670294
    https://github.com/scummvm/scummvm/commit/c275e304df97260ca79b5c2ca2b64e4de3670294
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-13T09:09:50+02:00

Commit Message:
MADS: Phantom: Rewrite logic for Scene102

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/scene.cpp
    engines/mads/scene.h
    engines/mads/sequence.cpp
    engines/mads/sequence.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index cb36be1..3b8016f 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -606,50 +606,86 @@ void Scene101::handleAnimation1() {
 /*------------------------------------------------------------------------*/
 
 Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) {
-	_animRunningFl = false;
+	_anim0RunningFl = false;
 }
 
 void Scene102::synchronize(Common::Serializer &s) {
 	Scene1xx::synchronize(s);
 
-	s.syncAsByte(_animRunningFl);
+	s.syncAsByte(_anim0RunningFl);
 }
 
 void Scene102::setup() {
-	//setPlayerSpritesPrefix();
+	setPlayerSpritesPrefix();
 	setAAName();
 }
 
 void Scene102::enter() {
-	_animRunningFl = false;
+	_anim0RunningFl = false;
 
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RAL86");
 
 	if (_globals[kCurrentYear] == 1993) {
 		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
-		// TODO
-		//_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_scene->drawToBackground(_globals._sequenceIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 	} else {
-		// TODO
+		_scene->_hotspots.activate(NOUN_CHANDELIER, false);
 	}
 
 	if (_scene->_priorSceneId == 101) {
 		_game._player._playerPos = Common::Point(97, 79);
 		_game._player._facing = FACING_SOUTHEAST;
-		// TODO
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
 		_game._player.walk(Common::Point(83, 87), FACING_SOUTHEAST);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 	} else if (_scene->_priorSceneId == 104) {
 		// Player fell from pit -> death
-		// TODO
+		Common::Point deathPos = Common::Point(0, 0);
+		int deathScale = 0;
+		int deathDepth = 0;
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+
+		switch (_globals[36]) {
+		case 0:
+			deathPos = Common::Point(221, 57);
+			deathScale = 50;
+			deathDepth = 14;
+			break;
+
+		case 1:
+			deathPos = Common::Point(219, 85);
+			deathScale = 60;
+			deathDepth = 6;
+			break;
+
+		case 2:
+			deathPos = Common::Point(257, 138);
+			deathScale = 76;
+			deathDepth = 1;
+			break;
+
+		default:
+			break;
+		}
+		_scene->_userInterface.emptyConversationList();
+		_scene->_userInterface.setup(kInputConversation);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], deathDepth);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], deathPos);
+		_scene->_sequences.setScale(_globals._sequenceIndexes[3], deathScale);
+		_scene->_sequences.setTimingTrigger(120, 65);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 	} else if (_scene->_priorSceneId == 103 || _scene->_priorSceneId != -1) {
 		_game._player._playerPos = Common::Point(282, 145);
 		_game._player._facing = FACING_WEST;
-		_animRunningFl = true;
-		// TODO: Door closing animation
+		_anim0RunningFl = true;
+		_scene->loadAnimation(formAnimName('d', 1), 60, 0);
 	} else if (_scene->_priorSceneId == -1) {
-		// TODO
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 	}
 
@@ -657,12 +693,20 @@ void Scene102::enter() {
 }
 
 void Scene102::step() {
-	if (_game._trigger == 60) {		// Door closes
-		// TODO
-		_animRunningFl = false;
-	} else if (_game._trigger == 65) {		// Death
-		// TODO
-		_scene->_currentSceneId = 104;
+	if (_game._trigger == 60) {
+		// Door closes
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+		_anim0RunningFl = false;
+	} else if (_game._trigger == 65) {
+		// Death
+		if (_globals[kDeathLocation] == 0)
+			_vm->_dialogs->show(10232);
+		else
+			_vm->_dialogs->show(10229);
+
+		_vm->_sound->command(16);
+		_scene->_nextSceneId = 104;
 	}
 }
 
@@ -675,34 +719,31 @@ void Scene102::preActions() {
 void Scene102::actions() {
 	if (_action.isAction(VERB_WALK_DOWN, NOUN_AISLE)) {
 		_scene->_nextSceneId = 101;
-		_game._player._stepEnabled = true;
-	}
-
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ORCHESTRA_DOOR) ||
+	} else if (_action.isAction(VERB_WALK_THROUGH, NOUN_ORCHESTRA_DOOR) ||
 		_action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR) ||
 		_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR)) {
-		if (_animRunningFl) {
-			// TODO
+		if (_anim0RunningFl) {
+			_scene->_sequences.setTimingTrigger(15, 70);
+			_game._player._stepEnabled = false;
 		} else {
-			_scene->_nextSceneId = 103;		// FIXME: temporary HACK - remove!
-
 			switch (_game._trigger) {
 			case 70:	// try again
 			case 0:
-				// TODO
+				_scene->deleteSequence(_globals._sequenceIndexes[2]);
+				_scene->loadAnimation(formAnimName('d', 0), 1, 0);
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
 				break;
 			case 1:
 				_scene->_nextSceneId = 103;
 				break;
+			default:
+				break;
 			}
 		}
-
-		_game._player._stepEnabled = true;
-	}
-
-	// TODO: Look around
-
-	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+	} else if (_action._lookFlag)
+		_vm->_dialogs->show(10210);
+	else if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
 		if (_action.isObject(NOUN_PIT))
 			_vm->_dialogs->show(10211);
 		else if (_action.isObject(NOUN_SEATS))
@@ -740,18 +781,12 @@ void Scene102::actions() {
 			_vm->_dialogs->show(10227);
 		else if (_action.isObject(NOUN_CHANDELIER))
 			_vm->_dialogs->show(10231);
-		else
-			return;
-
-		_game._player._stepEnabled = true;
-	}
-
-	if (_action.isAction(VERB_CLOSE, NOUN_ORCHESTRA_DOOR)) {
+	} else if (_action.isAction(VERB_CLOSE, NOUN_ORCHESTRA_DOOR)) {
 		_vm->_dialogs->show(10228);
-		_game._player._stepEnabled = true;
 	}
-}
 
+	_game._player._stepEnabled = false;
+}
 
 /*------------------------------------------------------------------------*/
 
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index bd5a479..2da9ba7 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -88,7 +88,7 @@ public:
 
 class Scene102 : public Scene1xx {
 private:
-	bool _animRunningFl;
+	bool _anim0RunningFl;
 
 public:
 	Scene102(MADSEngine *vm);
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index b02c251..0db0f93 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -754,4 +754,12 @@ void Scene::setDynamicAnim(int id, int anim_id, int segment) {
 void Scene::setCamera(Common::Point pos) {
 	warning("TODO: Scene::setCamera");
 }
+
+void Scene::drawToBackground(int series_id, int sprite_id, Common::Point pos, int depth, int scale) {
+	warning("TODO: Scene::drawToBackground");
+}
+
+void Scene::deleteSequence(int idx) {
+	warning("TODO: Scene::deleteSequence");
+}
 } // End of namespace MADS
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index d89cbb8..fd4ed24 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -256,6 +256,8 @@ public:
 
 	void setDynamicAnim(int id, int anim_id, int segment);
 	void setCamera(Common::Point pos);
+	void drawToBackground(int series_id, int sprite_id, Common::Point pos, int depth, int scale);
+	void deleteSequence(int idx);
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index dc67006..3b261f5 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -555,4 +555,8 @@ int SequenceList::addStampCycle(int srcSpriteIdx, bool flipped, int sprite) {
 	return -1;
 }
 
+int SequenceList::setTimingTrigger(int delay, int code) {
+	warning("TODO: SequenceList::setTimingTrigger");
+	return -1;
+}
 } // End of namespace
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
index df49170..0343e9c 100644
--- a/engines/mads/sequence.h
+++ b/engines/mads/sequence.h
@@ -127,6 +127,7 @@ public:
 	void setMotion(int seqIndex, int flags, int deltaX, int deltaY);
 
 	int addStampCycle(int srcSpriteIdx, bool flipped, int sprite);
+	int setTimingTrigger(int delay, int code);
 };
 
 } // End of namespace MADS


Commit: 79fbcb96c3532e730ad8298d96f56f4a52c77ead
    https://github.com/scummvm/scummvm/commit/79fbcb96c3532e730ad8298d96f56f4a52c77ead
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-15T11:21:31+02:00

Commit Message:
MADS: Add logic for scene 103, some rework on animations

Changed paths:
    engines/mads/conversations.cpp
    engines/mads/conversations.h
    engines/mads/game.cpp
    engines/mads/game.h
    engines/mads/phantom/globals_phantom.cpp
    engines/mads/phantom/globals_phantom.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/player.cpp
    engines/mads/player.h
    engines/mads/rails.cpp
    engines/mads/rails.h
    engines/mads/scene.cpp
    engines/mads/scene.h
    engines/mads/sequence.cpp
    engines/mads/sequence.h



diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp
index 8981578..52a6404 100644
--- a/engines/mads/conversations.cpp
+++ b/engines/mads/conversations.cpp
@@ -49,6 +49,10 @@ void GameConversation::exportPointer(int *val) {
 	warning("TODO GameConversation::exportPointer");
 }
 
+void GameConversation::exportValue(int val) {
+	warning("TODO GameConversation::exportValue");
+}
+
 void GameConversation::setHeroTrigger(int val) {
 	warning("TODO: GameConversation::setHeroTrigger");
 }
@@ -56,4 +60,9 @@ void GameConversation::setHeroTrigger(int val) {
 void GameConversation::setInterlocutorTrigger(int val) {
 	warning("TODO: GameConversation::setInterlocutorTrigger");
 }
+
+int* GameConversation::getVariable(int idx) {
+	warning("TODO: GameConversation::getVariable");
+	return nullptr;
+}
 } // End of namespace MADS
diff --git a/engines/mads/conversations.h b/engines/mads/conversations.h
index 9e25eb9..225fc4f 100644
--- a/engines/mads/conversations.h
+++ b/engines/mads/conversations.h
@@ -42,10 +42,13 @@ public:
 	 */
 	virtual ~GameConversation();
 
+	int* getVariable(int idx);
+
 	void get(int id);
 	void run(int id);
 	void stop();
 	void exportPointer(int *val);
+	void exportValue(int val);
 	void setHeroTrigger(int val);
 	void setInterlocutorTrigger(int val);
 
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index 332ac43..311a95c 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -599,4 +599,8 @@ void Game::createThumbnail() {
 	::createThumbnail(_saveThumb, _vm->_screen.getData(), MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT, thumbPalette);
 }
 
+void Game::syncTimers(int slave_type, int slave_id, int master_type, int master_id) {
+	warning("TODO: Game_syncTimers");
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/game.h b/engines/mads/game.h
index 95b54b0..2a1daac 100644
--- a/engines/mads/game.h
+++ b/engines/mads/game.h
@@ -235,6 +235,9 @@ public:
 	 * Creates a temporary thumbnail for use in saving games
 	 */
 	void createThumbnail();
+
+	void syncTimers(int slave_type, int slave_id, int master_type, int master_id);
+
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/phantom/globals_phantom.cpp b/engines/mads/phantom/globals_phantom.cpp
index e0db0a1..dd3bd84 100644
--- a/engines/mads/phantom/globals_phantom.cpp
+++ b/engines/mads/phantom/globals_phantom.cpp
@@ -34,6 +34,7 @@ PhantomGlobals::PhantomGlobals()
 	resize(210);
 	_spriteIndexes.resize(30);
 	_sequenceIndexes.resize(30);
+	_animationIndexes.resize(30);
 }
 
 void PhantomGlobals::synchronize(Common::Serializer &s) {
@@ -41,6 +42,7 @@ void PhantomGlobals::synchronize(Common::Serializer &s) {
 
 	_spriteIndexes.synchronize(s);
 	_sequenceIndexes.synchronize(s);
+	_animationIndexes.synchronize(s);
 }
 
 
diff --git a/engines/mads/phantom/globals_phantom.h b/engines/mads/phantom/globals_phantom.h
index c23b53c..cf35b40 100644
--- a/engines/mads/phantom/globals_phantom.h
+++ b/engines/mads/phantom/globals_phantom.h
@@ -124,6 +124,7 @@ class PhantomGlobals : public Globals {
 public:
 	SynchronizedList _spriteIndexes;
 	SynchronizedList _sequenceIndexes;
+	SynchronizedList _animationIndexes;
 public:
 	/**
 	 * Constructor
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index f7f4d15..83b7f8b 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -47,7 +47,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 102:	// music stands
 		return new Scene102(vm);
 	case 103:	// below stage
-		return new DummyScene(vm);	// TODO
+		return new Scene103(vm);
 	case 104:	// stage
 		return new DummyScene(vm);	// TODO
 	case 105:	// ground floor, storage room
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 3b8016f..979f978 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -187,8 +187,8 @@ void Scene101::enter() {
 		_brie_chandelier_position = 3;
 		_game._player.setWalkTrigger(50);
 
-		_scene->loadAnimation(formAnimName('b', 9), 1, 1);
-		_scene->loadAnimation(formAnimName('b', 8), 1, 0);
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1);
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 8), 1);
 
 		_anim_0_running  = true;
 		_anim_1_running  = true;
@@ -210,7 +210,7 @@ void Scene101::enter() {
 
 		_talk_count = 0;
 	} else if (_globals[kBrieTalkStatus] == 1) {
-		_scene->loadAnimation(formAnimName('b', 9), 1, 1);
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1);
 		_dynamic_brie = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[_dynamic_brie]._articleNumber = PREP_ON;
 		_scene->setDynamicAnim(_dynamic_brie, 1, 1);
@@ -223,8 +223,7 @@ void Scene101::enter() {
 			_vm->_gameConv->run(1);
 			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
 			_brie_chandelier_position = 4;
-			if (_scene->_animation[1])
-				_scene->_animation[1]->setCurrentFrame(25);
+			_scene->setAnimFrame(_globals._animationIndexes[1], 25);
 		}
 	} else if (_scene->_priorSceneId == 202) {
 		if (_globals[kJacquesStatus] == 1)
@@ -251,7 +250,7 @@ void Scene101::step() {
 	if (_anim_1_running) {
 		handleAnimation1();
 
-		if (_scene->_animation[1]->getCurrentFrame() == 80) {
+		if (_scene->getAnimFrame(_globals._animationIndexes[1]) == 80) {
 			_game._player._stepEnabled = true;
 			_game._player.setWalkTrigger(55);
 		}
@@ -425,8 +424,8 @@ void Scene101::handleAnimation0() {
 	int random;
 	int reset_frame;
 
-	if (_scene->_animation[0]->getCurrentFrame() != _brie_calling_frame) {
-		_brie_calling_frame = _scene->_animation[0]->getCurrentFrame();
+	if (_scene->getAnimFrame(_globals._animationIndexes[0]) != _brie_calling_frame) {
+		_brie_calling_frame = _scene->getAnimFrame(_globals._animationIndexes[0]);
 		reset_frame = -1;
 		switch (_brie_calling_frame) {
 		case 1:
@@ -493,8 +492,7 @@ void Scene101::handleAnimation0() {
 		}
 
 		if (reset_frame >= 0) {
-			if (_scene->_animation[0])
-				_scene->_animation[0]->setCurrentFrame(reset_frame);
+			_scene->setAnimFrame(_globals._animationIndexes[0], reset_frame);
 			_brie_calling_frame = reset_frame;
 		}
 	}
@@ -504,8 +502,8 @@ void Scene101::handleAnimation1() {
 	int random;
 	int reset_frame;
 
-	if (_scene->_animation[1]->getCurrentFrame() != _brie_chandelier_frame) {
-		_brie_chandelier_frame = _scene->_animation[1]->getCurrentFrame();
+	if (_scene->getAnimFrame(_globals._animationIndexes[1]) != _brie_chandelier_frame) {
+		_brie_chandelier_frame = _scene->getAnimFrame(_globals._animationIndexes[1]);
 		reset_frame = -1;
 		switch (_brie_chandelier_frame) {
 		case 1:
@@ -596,8 +594,7 @@ void Scene101::handleAnimation1() {
 		}
 
 		if (reset_frame >= 0) {
-			if (_scene->_animation[1])
-				_scene->_animation[1]->setCurrentFrame(reset_frame);
+			_scene->setAnimFrame(_globals._animationIndexes[1], reset_frame);
 			_brie_chandelier_frame = reset_frame;
 		}
 	}
@@ -683,7 +680,7 @@ void Scene102::enter() {
 		_game._player._playerPos = Common::Point(282, 145);
 		_game._player._facing = FACING_WEST;
 		_anim0RunningFl = true;
-		_scene->loadAnimation(formAnimName('d', 1), 60, 0);
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 60);
 	} else if (_scene->_priorSceneId == -1) {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
@@ -711,9 +708,8 @@ void Scene102::step() {
 }
 
 void Scene102::preActions() {
-	if (_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR) || _action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR)) {
+	if (_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR) || _action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR))
 		_game._player.walk(Common::Point(282, 145), FACING_EAST);
-	}
 }
 
 void Scene102::actions() {
@@ -730,7 +726,7 @@ void Scene102::actions() {
 			case 70:	// try again
 			case 0:
 				_scene->deleteSequence(_globals._sequenceIndexes[2]);
-				_scene->loadAnimation(formAnimName('d', 0), 1, 0);
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 0), 1);
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				break;
@@ -781,14 +777,1672 @@ void Scene102::actions() {
 			_vm->_dialogs->show(10227);
 		else if (_action.isObject(NOUN_CHANDELIER))
 			_vm->_dialogs->show(10231);
-	} else if (_action.isAction(VERB_CLOSE, NOUN_ORCHESTRA_DOOR)) {
+	} else if (_action.isAction(VERB_CLOSE, NOUN_ORCHESTRA_DOOR))
 		_vm->_dialogs->show(10228);
-	}
 
 	_game._player._stepEnabled = false;
 }
 
 /*------------------------------------------------------------------------*/
+Scene103::Scene103(MADSEngine *vm) : Scene1xx(vm) {
+	_jacquesAction = -1;
+	_lastRandom = -1;
+	_standPosition = -1;
+	_hotspotPrompt1 = -1;
+	_hotspotPrompt2 = -1;
+	_hotspotPrompt3 = -1;
+	_hotspotPrompt4 = -1;
+	_hotspotPrompt5 = -1;
+	_hotspotRightFloor1 = -1;
+	_hotspotRightFloor2 = -1;
+	_hotspotLeftFloor1 = -1;
+	_hotspotLeftFloor2 = -1;
+	_hotspotGentleman = -1;
+	_convCount = -1;
+	_lastStairFrame = -1;
+	_lastJacquesFrame = -1;
+	_talkCount = -1;
+
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+	_anim4ActvFl = false;
+	_anim5ActvFl = false;
+	_anim6ActvFl = false;
+	_climbThroughTrapFl = false;
+	_guardFrameFl = false;
+	_sitFl = false;
+}
+
+void Scene103::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsSint16LE(_jacquesAction);
+	s.syncAsSint16LE(_lastRandom);
+	s.syncAsSint16LE(_standPosition);
+	s.syncAsSint16LE(_hotspotPrompt1);
+	s.syncAsSint16LE(_hotspotPrompt2);
+	s.syncAsSint16LE(_hotspotPrompt3);
+	s.syncAsSint16LE(_hotspotPrompt4);
+	s.syncAsSint16LE(_hotspotPrompt5);
+	s.syncAsSint16LE(_hotspotRightFloor1);
+	s.syncAsSint16LE(_hotspotRightFloor2);
+	s.syncAsSint16LE(_hotspotLeftFloor1);
+	s.syncAsSint16LE(_hotspotLeftFloor2);
+	s.syncAsSint16LE(_convCount);
+	s.syncAsSint16LE(_lastStairFrame);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_anim3ActvFl);
+	s.syncAsByte(_anim4ActvFl);
+	s.syncAsByte(_anim5ActvFl);
+	s.syncAsByte(_anim6ActvFl);
+	s.syncAsByte(_climbThroughTrapFl);
+	s.syncAsByte(_guardFrameFl);
+	s.syncAsByte(_sitFl);
+}
+
+void Scene103::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->_initialVariant = 0;
+
+	if ((_globals[kPrompterStandStatus] == 1) || (_globals[kCurrentYear] == 1881)) {
+		_scene->_initialVariant = 1;
+		if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881))
+			_scene->_initialVariant = 2;
+		else if ((_globals[kJacquesStatus] >= 1) && (_globals[kCurrentYear] == 1881))
+			_scene->_initialVariant = 3;
+	}
+
+	_scene->addActiveVocab(NOUN_PROMPTERS_STAND);
+	_scene->addActiveVocab(NOUN_JACQUES);
+	_scene->addActiveVocab(NOUN_GENTLEMAN);
+	_scene->addActiveVocab(NOUN_CLIMB);
+}
+
+void Scene103::enter() {
+	if (_scene->_priorSceneId != -1) {
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+		_anim3ActvFl = false;
+		_anim4ActvFl = false;
+		_anim5ActvFl = false;
+		_anim6ActvFl = false;
+		_climbThroughTrapFl = false;
+		_guardFrameFl = false;
+		_sitFl = false;
+		_jacquesAction = 1; 
+		_lastRandom = 0;
+		_standPosition = 0;
+	}
+
+	if (_globals[kJacquesStatus] >= 1) {
+		if (_game._objects.isInRoom(OBJ_KEY)) {
+			_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+			_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false);
+		}
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	} else {
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), false);
+	}
+
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 2), false);
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_6", false);
+
+	adjustRails(_scene->_initialVariant);
+
+	_scene->_hotspots.activate(NOUN_JACQUES, false);
+	_scene->_hotspots.activate(NOUN_KEY,  false);
+
+	_vm->_gameConv->get(12);
+
+	if (_globals[kTrapDoorStatus] == 0) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 3);
+	} else if (_globals[kTrapDoorStatus] == 1) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 3);
+	}
+
+	Common::Point promptPos;
+	Facing promptFacing;
+
+	if (_globals[kJacquesStatus] == 0) {
+		promptPos = Common::Point(115, 142);
+		promptFacing = FACING_NORTHEAST;
+	} else {
+		promptPos = Common::Point(171, 142);
+		promptFacing = FACING_NORTHWEST;
+	}
+
+	if ((_globals[kPrompterStandStatus] == 1) || (_globals[kCurrentYear] == 1881)) {
+		if (_globals[kJacquesStatus] >= 1) {
+			_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+
+		} else {
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+
+			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1) ; 
+		}
+
+		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(121, 79, 40, 63));
+		_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, promptPos, promptFacing);
+
+		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(161, 67, 16, 75));
+		_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, promptPos, promptFacing);
+
+		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(177, 90, 18, 52));
+		_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, promptPos, promptFacing);
+
+		_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(114, 100, 7, 38));
+		_scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt4, promptPos, promptFacing);
+
+		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, -1, Common::Rect(121, 49, 40, 30));
+		_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST);
+		_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
+
+		_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(154, 6, 41, 6));
+		_scene->_dynamicHotspots[_hotspotRightFloor1]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotRightFloor1, Common::Point(171, 142), FACING_NONE);
+
+		_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(114, 136, 32, 6));
+		_scene->_dynamicHotspots[_hotspotRightFloor2]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotRightFloor2, Common::Point(127, 140), FACING_NONE);
+
+		if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881)) {
+			if (_globals[kJacquesNameIsKnown] >= 1) {
+				_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(156, 116, 33, 31));
+				_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
+				_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
+			} else {
+				_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_GENTLEMAN, VERB_WALKTO, SYNTAX_MASC_NOT_PROPER, -1, Common::Rect(156, 116, 33, 31));
+				_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
+				_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
+			}
+			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(149, 140, 13, 7));
+			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(155, 144), FACING_NONE);
+
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(187, 136, 8, 7));
+			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(195, 139), FACING_NONE);
+		} else if ((_globals[kJacquesStatus] >= 1) && (_globals[kCurrentYear] == 1881)) {
+			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 3);
+			if (_game._objects.isInRoom(OBJ_KEY)) {
+				_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+				_scene->_hotspots.activate(NOUN_KEY, true);
+			}
+			_scene->_hotspots.activate(NOUN_JACQUES, true);
+			_scene->_dynamicHotspots.remove(_hotspotRightFloor2);
+
+			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(114, 132, 30, 10));
+			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(95, 144), FACING_NORTHEAST);
+
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(94, 129, 18, 4));
+			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(95, 133), FACING_NONE);
+
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(94, 132, 3, 9));
+			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(93, 135), FACING_NONE);
+
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(112, 150, 21, 3));
+			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(118, 154), FACING_NONE);
+
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(98, 146, 21, 4));
+			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(104, 148), FACING_NONE);
+		}
+	} else if (_globals[kPrompterStandStatus] == 0) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); 
+
+		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(2, 79, 40, 63));
+		_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST);
+
+		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(42, 67, 16, 75));
+		_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(59, 140), FACING_NORTHWEST);
+
+		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(58, 90, 18, 52));
+		_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST);
+
+		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, -1, Common::Rect(2, 49, 40, 30));
+		_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST);
+		_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
+
+		_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(35, 137, 40, 5));
+		_scene->_dynamicHotspots[_hotspotLeftFloor1]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor1, Common::Point(59, 140), FACING_NONE);
+		_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(76, 129, 6, 6));
+		_scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE);
+	}
+
+	if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881)) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('j', 1), 1);
+		_anim0ActvFl = true;
+		_scene->setAnimFrame(_globals._animationIndexes[0], 9);
+	}
+
+	if (_scene->_priorSceneId == 104) {
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		if (_globals[kRoom103104Transition] == 0) {
+			_globals[kRoom103104Transition] = 1;
+			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
+			_standPosition = 1;
+			_game._player._playerPos = Common::Point(79, 132);
+			_scene->_sequences.setTimingTrigger(1, 100);
+		} else {
+			_standPosition = 2;
+			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 0);
+			_anim3ActvFl = true;
+			_game._player._stepEnabled = true;
+			_game._player._playerPos = Common::Point(196, 134);
+			_scene->setAnimFrame(_globals._animationIndexes[3], 36);
+
+			_scene->deleteSequence(_globals._sequenceIndexes[3]);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);  
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+		}
+
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+	} else if (_scene->_priorSceneId == 102) {
+		_game._player.firstWalk(Common::Point(-20, 140), FACING_EAST, Common::Point(15, 147), FACING_EAST, true);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+	} else if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId != -1)) {
+		_game._player._playerPos = Common::Point(287, 135);
+		_game._player._facing = FACING_WEST;
+		_game._player._stepEnabled = false;
+		_game._player.walk(Common::Point(252, 134), FACING_WEST);
+		_game._player.setWalkTrigger(65);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 6);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+	} else if (_scene->_priorSceneId == -1) {
+		if (_standPosition == 1) {
+			_game._player._visible = false;
+			_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0);
+			_anim5ActvFl = true;
+			_scene->setAnimFrame(_globals._animationIndexes[5], 33);
+
+		} else if (_standPosition == 2) {
+
+			_scene->deleteSequence(_globals._sequenceIndexes[3]);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);  
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+			_game._player._visible = false;
+			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 0);
+			_anim3ActvFl = true;
+			_game._player._stepEnabled = true;
+			_scene->setAnimFrame(_globals._animationIndexes[3], 36);
+
+		} else if (_vm->_gameConv->_restoreRunning == 12) {
+			_vm->_gameConv->run(12);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_vm->_gameConv->exportValue(_globals[kMusicSelected]);
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		}
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene103::step() {
+	if (_anim0ActvFl)
+		handleJacquesAnim();
+
+	if (_anim3ActvFl)
+		climbRightStairs();
+
+	if (_anim5ActvFl)
+		climbLeftStairs();
+
+	if (_anim4ActvFl)
+		descendRightStairs();
+
+	if (_anim6ActvFl)
+		descendLeftStairs();
+
+	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
+		++_convCount;
+		if (_convCount > 200)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+
+	switch (_game._trigger) {
+	case 65:
+		_scene->deleteSequence(_globals._sequenceIndexes[1]);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addBackwardSequence(_globals._spriteIndexes[1], false, 8, 0, 0, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 6);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
+		_vm->_sound->command(66);
+		break; 
+
+	case 66: {
+		int syncIdx = _globals._sequenceIndexes[1];
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_game.syncTimers(1, _globals._sequenceIndexes[1], 1, syncIdx); 
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_game._player._stepEnabled = true;
+		}
+		break;
+
+	case 80:
+		_scene->_nextSceneId = 104;
+		_scene->_reloadSceneFlag = true;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 100:
+		_scene->deleteSequence(_globals._sequenceIndexes[10]);
+		_globals._sequenceIndexes[10] = _scene->_sequences.addBackwardSequence(_globals._spriteIndexes[10], false, 6, 0, 0, 1);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 101);
+		_scene->_sequences.setRange(_globals._sequenceIndexes[10], -1, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
+		break; 
+
+	case 101:
+		_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0);
+		_anim5ActvFl = true;
+		_scene->setAnimFrame(_globals._animationIndexes[5], 33);
+		_game._player._stepEnabled = true;
+		_game.syncTimers(3, _globals._animationIndexes[5], 1, _globals._sequenceIndexes[10]);
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 0:
+		if (_anim1ActvFl) {
+			if ((_scene->getAnimFrame(_globals._animationIndexes[1]) == 10) && !_guardFrameFl) {
+				_vm->_sound->command(64);
+				_guardFrameFl = true;
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_scene->deleteSequence(_globals._sequenceIndexes[9]);
+				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[0], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 105);
+			}
+		} else if (_anim2ActvFl) {
+			if ((_scene->getAnimFrame(_globals._animationIndexes[2]) == 7) && !_guardFrameFl) {
+				_vm->_sound->command(64);
+				_guardFrameFl = true;
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_scene->deleteSequence(_globals._sequenceIndexes[9]);
+				_globals._sequenceIndexes[0] = _scene->_sequences.addBackwardSequence(_globals._spriteIndexes[0], false, 6, 0, 0, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[0], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 110);
+			}
+		}
+		break;
+
+	case 105:
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 2);
+		_guardFrameFl = false;
+		break;
+
+	case 110:
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 2);
+		_guardFrameFl = false;
+		break;
+
+	default:
+		break;
+	}
+
+	if (_globals[kJacquesStatus] == 3) {
+		warning("TODO: add a check on the return value of _vm->_sound->command ???");
+		_vm->_sound->command(38);
+	}
+}
+
+void Scene103::preActions() {
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+		_game._player._needToWalk = true;
+
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR_TO_PIT)) {
+		_game._player.walk(Common::Point(0, 150), FACING_WEST);
+		_game._player._walkOffScreenSceneId = 102;
+	}
+
+	if ((_standPosition != 0) && !_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) &&
+		!_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR) &&
+		!_action.isAction(NOUN_CLIMB, NOUN_PROMPTERS_STAND) &&
+		!_action.isAction(VERB_PUSH, NOUN_TRAP_DOOR) &&
+		!_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) &&
+		!_action.isAction(VERB_PULL, NOUN_TRAP_DOOR)) {
+
+		if (_action.isAction(VERB_PULL) || _action.isAction(VERB_PUSH)) {
+			if (!_action.isAction(NOUN_LEVER) && !_game._trigger)
+				_game._player._needToWalk = false;
+		}
+
+		if ((_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) || (_action.isAction(VERB_PULL, NOUN_PROMPTERS_STAND))) {
+			if (!_game._trigger)
+				_game._player._needToWalk = true;
+		}
+
+		if (_game._player._needToWalk) {
+			if (_globals[kPrompterStandStatus] == 0) {
+				switch (_game._trigger) {
+				case 0:
+					_scene->freeAnimation(5);
+					_game._player._readyToWalk = false;
+					_game._player._visible = false;
+					_game._player._stepEnabled = false;
+					_anim5ActvFl = false;
+					_anim6ActvFl = true;
+					_globals._animationIndexes[6] = _scene->loadAnimation(formAnimName('w', 4), 1);
+					break;
+
+				case 1:
+					_game._player._playerPos = Common::Point(79, 132);
+					_game._player._stepEnabled = true;
+					_game._player._visible = true;
+					_standPosition = 0;
+					_game._player._readyToWalk = true;
+					if (_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND))
+						_game._player._needToWalk = false;
+					_anim6ActvFl = false;
+					_game._player.resetFacing(FACING_NORTHEAST);
+					_game.syncTimers(2, 0, 3, _globals._animationIndexes[6]);
+					break;
+
+				default:
+					break;
+				}
+			} else {
+				switch (_game._trigger) {
+				case 0:
+					_scene->freeAnimation(3);
+					_game._player._readyToWalk = false;
+					if (_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND))
+						_game._player._needToWalk = true;
+					_game._player._visible = false;
+					_game._player._stepEnabled = false;
+					_anim3ActvFl = false;
+					_anim4ActvFl = true;
+					_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('w', 2), 1);
+					break;
+
+				case 1:
+					_game._player._playerPos = Common::Point(196, 134);
+					_game._player._stepEnabled = true;
+					_game._player._readyToWalk = true;
+					if (_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND))
+						_game._player._needToWalk = false;
+					_game._player._visible = true;
+					_standPosition = 0;
+					_anim4ActvFl = false;
+					_game._player.resetFacing(FACING_NORTHEAST);
+					_game.syncTimers(2, 0, 3, _globals._animationIndexes[4]);
+					break;
+
+				default:
+					break;
+				}
+			}
+		}
+	}
+
+	if (_standPosition == 0) {
+		if ((_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) || (_action.isAction(VERB_PULL, NOUN_PROMPTERS_STAND))) {
+			if (_globals[kCurrentYear] == 1993) {
+				if (_globals[kPrompterStandStatus] == 0)
+					_game._player.walk(Common::Point(2, 138), FACING_WEST);
+				else
+					_game._player.walk(Common::Point(176, 142), FACING_WEST);
+			}
+		}
+	}
+
+	if (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) && (_standPosition == 0) && (_globals[kPrompterStandStatus] == 0) && (_globals[kCurrentYear] == 1993))
+		_game._player.walk(Common::Point(79, 132), FACING_SOUTHWEST);
+
+	if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) && (_standPosition == 0) && (_globals[kPrompterStandStatus] == 1) && (_globals[kTrapDoorStatus] == 0))
+		_game._player.walk(Common::Point(196, 134), FACING_SOUTHWEST);
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_PIT))
+		_game._player._walkOffScreenSceneId = 102;
+
+	if ((_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR)) && (_standPosition == 0))
+		_game._player.walk(Common::Point(252, 134), FACING_EAST);
+}
+
+void Scene103::actions() {
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR_TO_PIT)) {
+		_scene->_nextSceneId = 102;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 12) {
+		process_conv_jacques();
+		_action._inProgress = false;
+		return;
+	} 
+
+	if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) {
+		if (_globals[kTrapDoorStatus] == 1) {
+			_vm->_dialogs->show(10333);
+			_action._inProgress = false;
+			return;
+		} else if (_globals[kPrompterStandStatus] == 0) {
+			_vm->_dialogs->show(10341);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if ((_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX)) && (_globals[kPrompterStandStatus] == 1)) {
+		_vm->_dialogs->show(10342);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(NOUN_CLIMB, NOUN_PROMPTERS_STAND) && _standPosition == 0) ||
+		(_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) && (_standPosition == 0)) ||
+		(_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) && (_standPosition == 0))) {
+		if (_globals[kPrompterStandStatus] == 0) {
+			if (_game._trigger == 0) {
+				if (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX)) {
+					_sitFl = true;
+					_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 115); 
+				} else
+					_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0); 
+
+				_game._player._visible = false;
+				_game._player._stepEnabled = false;
+				_anim5ActvFl = true;
+				_game.syncTimers(3, _globals._animationIndexes[5], 2, 0);
+				_action._inProgress = false;
+				return;
+			}
+		} else if (_game._trigger == 0) {
+			if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) {
+				_climbThroughTrapFl = true;
+				_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 120);
+			} else
+				_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 0);
+
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+			_anim3ActvFl = true;
+			_game.syncTimers(3, _globals._animationIndexes[3], 2, 0);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(NOUN_CLIMB, NOUN_PROMPTERS_STAND)) {
+		if (_standPosition != 0) {
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if ((_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) || (_action.isAction(VERB_PULL, NOUN_PROMPTERS_STAND))) {
+		if (_globals[kCurrentYear] == 1993) {
+			if (_globals[kPrompterStandStatus] == 0) {
+				switch (_game._trigger) {
+				case 0:
+					if (_globals[kPrompterStandStatus] == 0) {
+						_game._player._stepEnabled = false;
+						_game._player._visible = false;
+						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 1), 75);
+						_game._player._priorTimer = _scene->_frameStartTime;
+						_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+						_scene->deleteSequence(_globals._sequenceIndexes[3]);
+					}
+					break;
+
+				case 75:
+					if (_globals[kPrompterStandStatus] == 0) {
+						_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1) ; 
+						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+						_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[0]);
+						_globals[kPrompterStandStatus] = 1;
+						_game._player._stepEnabled = true;
+						_game._player._visible = true;
+						_game._player._playerPos = Common::Point(117, 139);
+						_game._player.resetFacing(FACING_EAST);
+						_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+
+						_scene->_dynamicHotspots.remove(_hotspotPrompt1);
+						_scene->_dynamicHotspots.remove(_hotspotPrompt2);
+						_scene->_dynamicHotspots.remove(_hotspotPrompt3);
+						_scene->_dynamicHotspots.remove(_hotspotPrompt5);
+						_scene->_dynamicHotspots.remove(_hotspotLeftFloor1);
+						_scene->_dynamicHotspots.remove(_hotspotLeftFloor2);
+
+						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(121, 79, 40, 63));
+						_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(171, 142), FACING_NORTHWEST);
+
+						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(161, 67, 16, 75));
+						_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(171, 142), FACING_NORTHWEST);
+
+						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(177, 90, 18, 52));
+						_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(171, 142), FACING_NORTHWEST);
+
+						_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(114, 100, 7, 38));
+						_scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt4, Common::Point(171, 142), FACING_NORTHWEST);
+
+						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, -1, Common::Rect(121, 49, 40, 30));
+						_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST);
+						_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
+
+						_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(154, 6, 41, 6));
+						_scene->_dynamicHotspots[_hotspotRightFloor1]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotRightFloor1, Common::Point(171, 142), FACING_NONE);
+
+						_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(114, 136, 32, 6));
+						_scene->_dynamicHotspots[_hotspotRightFloor2]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotRightFloor2, Common::Point(127, 140), FACING_NONE);
+
+						_scene->changeVariant(1);
+						adjustRails(1);
+					}
+					break;
+
+				default:
+					break;
+				}
+			} else {
+				switch (_game._trigger) {
+				case 0:
+					if (_globals[kPrompterStandStatus] == 1) {
+						_game._player._stepEnabled = false;
+						_game._player._visible = false;
+						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 2), 75);
+						_game._player._priorTimer = _scene->_frameStartTime;
+						_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+						_scene->deleteSequence(_globals._sequenceIndexes[12]);
+						_scene->deleteSequence(_globals._sequenceIndexes[3]);
+					}
+					break;
+
+				case 75:
+					if (_globals[kPrompterStandStatus] == 1) {
+						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); 
+						_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[0]);
+						_globals[kPrompterStandStatus] = 0;
+						_game._player._stepEnabled = true;
+						_game._player._visible = true;
+						_game._player._playerPos = Common::Point(62, 142);
+						_game._player.resetFacing(FACING_WEST);
+						_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+						_scene->_dynamicHotspots.remove(_hotspotPrompt1);
+						_scene->_dynamicHotspots.remove(_hotspotPrompt2);
+						_scene->_dynamicHotspots.remove(_hotspotPrompt3);
+						_scene->_dynamicHotspots.remove(_hotspotPrompt4);
+						_scene->_dynamicHotspots.remove(_hotspotPrompt5);
+						_scene->_dynamicHotspots.remove(_hotspotRightFloor1);
+						_scene->_dynamicHotspots.remove(_hotspotRightFloor2);
+
+						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(2, 79, 40, 63));
+						_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST);
+
+						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(42, 67, 16, 75));
+						_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(59, 140), FACING_NORTHWEST);
+
+						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(58, 90, 18, 52));
+						_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST);
+
+						_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(35, 137, 40, 5));
+						_scene->_dynamicHotspots[_hotspotLeftFloor1]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor1, Common::Point(59, 140), FACING_NONE);
+
+						_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(76, 129, 6, 6));
+						_scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE);
+
+						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, -1, Common::Rect(2, 49, 40, 30));
+						_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
+						_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST);
+						_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
+
+						_scene->changeVariant(0);
+						adjustRails(0);
+					}
+					break;
+
+				default:
+					break;
+				}
+			}
+		} else {
+			if (_globals[kJacquesNameIsKnown])
+				_vm->_dialogs->show(10340);
+			else
+				_vm->_dialogs->show(10350);
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR)) {
+		if ((_globals[kCurrentYear] == 1881) && !_action.isAction(NOUN_LOCK, NOUN_DOOR) && !_action.isAction(VERB_UNLOCK, NOUN_DOOR)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 0, 0, 2);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[2], -1, -2);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 2, 3, 70);
+				break;
+
+			case 2:
+				_game._player._visible = true;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]); 
+				_game._player.walk(Common::Point(295, 132), FACING_WEST);
+				_scene->_sequences.setTimingTrigger(180, 3);
+				break;
+
+			case 3:
+				_scene->_nextSceneId = 105;
+				break;
+
+			case 70:
+				_vm->_sound->command(24);
+				_scene->deleteSequence(_globals._sequenceIndexes[1]);
+				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 1);   
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); 
+				_scene->_sequences.setRange(_globals._sequenceIndexes[1], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 71);
+				_vm->_sound->command(66);
+				break; 
+
+			case 71: {
+				int oldIdx = _globals._sequenceIndexes[1];
+				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2);
+				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, oldIdx); 
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+				}
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;  
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 0, 0, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 1);
+				break;
+
+			case 1: {
+				int oldIdx = _globals._sequenceIndexes[2];
+				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
+				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, oldIdx); 
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
+				_scene->_sequences.setTimingTrigger(15, 2);
+				_vm->_sound->command(73);
+				}
+				break; 
+
+			case 2:
+				_scene->deleteSequence(_globals._sequenceIndexes[2]);
+				_globals._sequenceIndexes[2] = _scene->_sequences.addBackwardSequence(_globals._spriteIndexes[2], false, 5, 0, 0, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 3);
+				break;
+
+			case 3:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]); 
+				_game._player._visible = true;
+				if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
+					_vm->_dialogs->show(00032);
+				else
+					_vm->_dialogs->show(10335);
+
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_KEY) && (_game._objects.isInRoom(OBJ_KEY) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;  
+			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 0, 0, 2);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[8], 1, 5);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+			_action._inProgress = false;
+			return;
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[5]);
+			_scene->_hotspots.activate(NOUN_KEY, false);
+			_game._objects.addToInventory(OBJ_KEY);
+			_vm->_sound->command(26);
+			_action._inProgress = false;
+			return;
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			_action._inProgress = false;
+			return;
+			break;
+
+		case 3:
+			_globals[kPlayerScore] += 5;
+			_vm->_dialogs->showItem(OBJ_KEY, 800, 0);
+			_game._player._stepEnabled = true;
+			_action._inProgress = false;
+			return;
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_GENTLEMAN) || _action.isAction(VERB_TALK_TO, NOUN_JACQUES)) {
+		if (_globals[kJacquesStatus] == 0) {
+			_vm->_gameConv->run(12);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_vm->_gameConv->exportValue(_globals[kMusicSelected]);
+		} else
+			_vm->_dialogs->show(10343);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) || _climbThroughTrapFl) {
+		if ((_standPosition == 2) && (_globals[kTrapDoorStatus] == 0))  {
+			switch (_game._trigger) {
+			case 0:
+			case 120:
+				if (!(_globals[kPlayerScoreFlags] & 1)) {
+					_globals[kPlayerScoreFlags] |= 1;
+					_globals[kPlayerScore] += 3;
+				}
+
+				_scene->freeAnimation(3);
+				_anim3ActvFl = false;
+				_climbThroughTrapFl = false;
+				_game._player._stepEnabled = false;
+				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 0, 0, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 5);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[11], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 1);
+				break;
+
+			case 1:
+				_globals[kRoom103104Transition] = 1;
+				_scene->_nextSceneId = 104;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}    
+
+	if (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) || _sitFl) {
+		if (_standPosition == 1) {
+			switch (_game._trigger) {
+			case 0:
+			case 115:
+				_scene->freeAnimation(5);
+				_anim5ActvFl = false;
+				_game._player._stepEnabled = false;
+				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 0, 0, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[10], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 1);
+				if (!_sitFl)
+					_game.syncTimers(1, _globals._sequenceIndexes[10], 3, _globals._animationIndexes[5]);
+				_sitFl = false;
+				break;
+
+			case 1:
+				_globals[kRoom103104Transition] = 0;
+				_scene->_nextSceneId = 104;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PUSH, NOUN_LEVER) || _action.isAction(VERB_PULL, NOUN_LEVER)) {
+		if (_globals[kTrapDoorStatus] == 1) { 
+			switch (_game._trigger) {
+			case 0:
+				_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('l', 1), 1);
+				_anim1ActvFl   = true;
+				_game._player._visible = false;
+				_game._player._stepEnabled = false;
+				_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+				break;
+
+			case 1:
+				_anim1ActvFl    = false;
+				_game._player._visible = true;
+				_globals[kTrapDoorStatus] = 0; 
+				_game._player._stepEnabled = true;
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			switch (_game._trigger) {
+			case 0:
+				_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('l', 2), 1);
+				_anim2ActvFl = true;
+				_game._player._visible = false;
+				_game._player._stepEnabled = false;
+				_game.syncTimers(3, _globals._animationIndexes[2], 2, 0);
+				break;
+
+			case 1:
+				_anim2ActvFl = false;
+				_game._player._visible = true;
+				_globals[kTrapDoorStatus] = 1; 
+				_game._player._stepEnabled = true;
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[2]);
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		if ((_globals[kCurrentYear] == 1881) && (_globals[kJacquesStatus] >= 1))
+			_vm->_dialogs->show(10311);
+		else
+			_vm->_dialogs->show(10310);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_PROMPTERS_STAND)) {
+			if (_globals[kJacquesStatus] >= 1)
+				_vm->_dialogs->show(10349);
+			else if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(10312);
+			else
+				_vm->_dialogs->show(10345);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_FLOOR)) {
+			_vm->_dialogs->show(10313);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_TRAP_CEILING)) {
+			_vm->_dialogs->show(10314);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DOOR)) {
+			_vm->_dialogs->show(10315);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DOOR_TO_PIT)) {
+			_vm->_dialogs->show(10316);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(10317);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROMPTERS_BOX)) {
+			_vm->_dialogs->show(10318);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_TRAP_DOOR)) {
+			_vm->_dialogs->show(10319);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_JUNK)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(10320);
+			else
+				_vm->_dialogs->show(10346);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CARTON)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(10321);
+			else
+				_vm->_dialogs->show(10347);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_GARBAGE_CAN)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(10322);
+			else
+				_vm->_dialogs->show(10348);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CABLE)) {
+			_vm->_dialogs->show(10323);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_JACQUES) || _action.isAction(NOUN_GENTLEMAN)) {
+			if (_globals[kJacquesStatus] == 0)
+				_vm->_dialogs->show(10324);
+			else
+				_vm->_dialogs->show(10325);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_KEY)) {
+			if (_game._objects.isInRoom(OBJ_KEY)) {
+				_vm->_dialogs->show(10326);
+				_action._inProgress = false;
+				return;
+			}
+		}
+
+		if (_action.isAction(NOUN_STAIR_UNIT)) {
+			_vm->_dialogs->show(10327);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(10328);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WATER_PIPE)) {
+			_vm->_dialogs->show(10329);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROMPTERS_SEAT)) {
+			_vm->_dialogs->show(10338);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LEVER)) {
+			_vm->_dialogs->show(10339);
+			_action._inProgress = false;
+			return;
+		}
+
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_DOOR_TO_PIT)) {
+		_vm->_dialogs->show(10331);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) {
+		_vm->_dialogs->show(10331);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) || (_action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR))) {
+		_vm->_dialogs->show(10344);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_JACQUES) || _action.isAction(VERB_TAKE, NOUN_GENTLEMAN)) {
+		if (_globals[kJacquesStatus] == 0) {
+			if (_globals[kJacquesNameIsKnown])
+				_vm->_dialogs->show(10336);
+			else
+				_vm->_dialogs->show(10351);
+		} else
+			_vm->_dialogs->show(10337);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene103::adjustRails(int variant) {
+	switch (variant) {
+	case 0:
+		_scene->_rails.disableNode(3);
+		_scene->_rails.disableNode(4);
+		_scene->_rails.disableNode(5);
+		_scene->_rails.disableNode(6);
+		_scene->_rails.disableNode(12);
+		_scene->_rails.disableNode(13);
+		_scene->_rails.disableNode(14);
+		break;
+
+	case 1:
+		_scene->_rails.disableNode(1);
+		_scene->_rails.disableNode(2);
+		_scene->_rails.disableNode(3);
+		_scene->_rails.disableNode(4);
+		_scene->_rails.disableNode(5);
+		_scene->_rails.disableNode(6);
+		_scene->_rails.disableNode(7);
+		_scene->_rails.disableNode(9);
+		_scene->_rails.disableNode(10);
+		_scene->_rails.disableNode(11);
+		break;
+
+	case 2:
+		_scene->_rails.disableNode(1);
+		_scene->_rails.disableNode(2);
+		_scene->_rails.disableNode(5);
+		_scene->_rails.disableNode(6);
+		_scene->_rails.disableNode(7);
+		_scene->_rails.disableNode(9);
+		_scene->_rails.disableNode(10);
+		_scene->_rails.disableNode(11);
+		break;
+
+	case 3:
+		_scene->_rails.disableNode(1);
+		_scene->_rails.disableNode(2);
+		_scene->_rails.disableNode(3);
+		_scene->_rails.disableNode(4);
+		_scene->_rails.disableNode(10);
+		_scene->_rails.disableNode(11);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene103::handleJacquesAnim() {
+	if (_scene->getAnimFrame(_globals._animationIndexes[0]) == _lastJacquesFrame)
+		return;
+
+	_lastJacquesFrame = _scene->getAnimFrame(_globals._animationIndexes[0]);
+	int resetFrame = -1;
+	int random;
+
+	switch (_lastJacquesFrame) {
+	case 1:
+	case 2:
+	case 3:
+	case 9:
+	case 17:
+	case 23:
+	case 33:
+	case 51:
+		switch (_jacquesAction) {
+		case 2:
+			random = 4;
+			_jacquesAction = 0;
+			break;
+
+		case 3:
+			random = 5;
+			_jacquesAction = 0;
+			break;
+
+		case 4:
+			random = 6;
+			break;
+
+		case 0:
+			random = _vm->getRandomNumber(1, 3);
+			++_talkCount;
+			if (_talkCount > 22) {
+				_jacquesAction = 1;
+				random = 9;
+			}
+			break;
+
+		default:
+			random = _vm->getRandomNumber(6, 50);
+			while (_lastRandom == random)
+				random = _vm->getRandomNumber(6, 50);
+
+			_lastRandom = random;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 0;
+			break;
+
+		case 2:
+			resetFrame = 1;
+			break;
+
+		case 3:
+			resetFrame = 2;
+			break;
+
+		case 4:
+			resetFrame = 4;
+			break;
+
+		case 5:
+			resetFrame = 10;
+			break;
+
+		case 6:
+			resetFrame = 34;
+			break;
+
+		case 7:
+			resetFrame = 24;
+			break;
+
+		case 8:
+			resetFrame = 18;
+			break;
+
+		default:
+			resetFrame = 8;
+			break;
+		}
+		break;
+
+	case 36:    
+	case 40:    
+	case 48:    
+		switch (_jacquesAction) {
+		case 0:
+		case 2:
+		case 3:
+			random = 2; 
+			break;
+
+		case 4:
+			random = 1;
+			_jacquesAction = 0;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(2, 50);
+			while (_lastRandom == random)
+				random = _vm->getRandomNumber(2, 50);
+			_lastRandom = random;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 37;
+			break; 
+
+		case 2:
+			resetFrame = 49;
+			break; 
+
+		case 3:
+			resetFrame = 41;
+			break; 
+
+		default:
+			resetFrame = 35;
+			break; 
+		}
+		break;
+
+	case 44:   
+		random = _vm->getRandomNumber(1, 50);
+		while (_lastRandom == random) {
+			random = _vm->getRandomNumber(1, 50);
+		}
+		_lastRandom = random;
+
+		switch (_jacquesAction) {
+		case 0:
+		case 2:
+		case 3:
+		case 4:
+			random = 1; 
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 50);
+			while (_lastRandom == random)
+				random = _vm->getRandomNumber(1, 50);
+			_lastRandom = random;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 45;
+			break; 
+
+		default:
+			resetFrame = 43;
+			break; 
+		}
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_lastJacquesFrame = resetFrame;
+	}
+}
+
+void Scene103::climbRightStairs() {
+	if (_scene->getAnimFrame(_globals._animationIndexes[3]) == _lastStairFrame)
+		return;
+
+	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[3]);
+	int stairs_reset_frame = -1;
+
+	if (_lastStairFrame == 37) {
+		stairs_reset_frame = 36;
+		_standPosition = 2;
+		_game._player._stepEnabled = true;
+	}
+
+	if (_lastStairFrame == 2) {
+		_scene->deleteSequence(3);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); 
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+	}
+
+	if (stairs_reset_frame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[3], stairs_reset_frame);
+		_lastStairFrame = stairs_reset_frame;
+	}
+}
+
+void Scene103::climbLeftStairs() {
+	if (_scene->getAnimFrame(_globals._animationIndexes[5]) == _lastStairFrame)
+		return;
+
+	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[5]);
+	int stairs_reset_frame  = -1;
+
+	if (_lastStairFrame == 34) {
+		stairs_reset_frame = 33;
+		_standPosition = 1;
+		_game._player._stepEnabled = true;
+	}
+
+	if (_lastStairFrame == 2) {
+		_scene->deleteSequence(3);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); 
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); 
+	}
+
+	if (stairs_reset_frame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[5], stairs_reset_frame);
+		_lastStairFrame = stairs_reset_frame;
+	}
+}
+
+void Scene103::descendRightStairs() {
+	if (_scene->getAnimFrame(_globals._animationIndexes[4]) == _lastStairFrame)
+		return;
+
+	// CHECKME: use of this local variable
+	int stairs_reset_frame = -1;
+	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[4]);
+
+	if (_lastStairFrame == 2) {
+		_scene->deleteSequence(3);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);  
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+	}
+
+	if (stairs_reset_frame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[4], stairs_reset_frame);
+		_lastStairFrame = stairs_reset_frame;
+	}
+}
+
+void Scene103::descendLeftStairs() {
+	if (_scene->getAnimFrame(_globals._animationIndexes[6]) == _lastStairFrame)
+		return;
+
+	// CHECKME: use of this local variable
+	int stairs_reset_frame = -1;
+	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[6]);
+
+	if (_lastStairFrame == 2) {
+		_scene->deleteSequence(3);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);  
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); 
+	}
+
+	if (stairs_reset_frame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[6], stairs_reset_frame);
+		_lastStairFrame = stairs_reset_frame;
+	}
+}
+
+void Scene103::process_conv_jacques() {
+	int quit_converse = false;
+	int *value_1;
+
+	switch (_action._activeAction._verbId) {
+	case 1:
+		_vm->_gameConv->setInterlocutorTrigger(96);
+		if (_globals[kJacquesNameIsKnown] == 0) {
+			_globals[kJacquesNameIsKnown] = 1;
+			_scene->_dynamicHotspots.remove(_hotspotGentleman);
+			_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(156, 116, 33, 31));
+			_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
+		}
+		break;
+
+	case 4:
+	case 6:
+	case 7:
+	case 10:
+	case 19:
+	case 30:
+		_globals[kWalkerConverse] = 0;
+		value_1 = _vm->_gameConv->getVariable(26);
+		if (*value_1)
+			_globals[kJacquesNameIsKnown] = 2;
+
+		quit_converse = true;
+		break;
+
+	case 8:
+		_vm->_gameConv->setInterlocutorTrigger(94);
+		break;
+
+	case 12:
+		_vm->_gameConv->setInterlocutorTrigger(96);
+		break;
+
+	case 29:
+		_vm->_gameConv->setInterlocutorTrigger(98);
+		break;
+
+	default:
+		break;
+	}
+
+	if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 8) && (_action._activeAction._verbId != 12) && (_action._activeAction._verbId != 29))
+		_vm->_gameConv->setInterlocutorTrigger(90);
+
+	_vm->_gameConv->setHeroTrigger(92);
+
+	switch (_game._trigger) {
+	case 90:
+		if (!quit_converse)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_jacquesAction = 0;
+		break;
+
+	case 92:
+		if (!quit_converse)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+		_convCount = 0;
+		_jacquesAction = 1;
+		break;
+
+	case 94:
+		if (!quit_converse)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_jacquesAction = 2;
+		break;
+
+	case 96:
+		if (!quit_converse)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_jacquesAction = 3;
+		break;
+
+	case 98:
+		if (!quit_converse)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_jacquesAction = 4;
+		break;
+
+	default:
+		break;
+	}
+
+	_talkCount = 0;
+}
+
+/*------------------------------------------------------------------------*/
 
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 2da9ba7..f978fa4 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -101,6 +101,56 @@ public:
 	virtual void actions();
 };
 
+class Scene103 : public Scene1xx {
+private:
+	int _jacquesAction;
+	int _lastRandom;
+	int _standPosition;
+	int _hotspotPrompt1;
+	int _hotspotPrompt2;
+	int _hotspotPrompt3;
+	int _hotspotPrompt4;
+	int _hotspotPrompt5;
+	int _hotspotRightFloor1;
+	int _hotspotRightFloor2;
+	int _hotspotLeftFloor1;
+	int _hotspotLeftFloor2;
+	int _hotspotGentleman;
+	int _convCount;
+	int _lastStairFrame;
+	int _lastJacquesFrame;
+	int _talkCount;
+
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _anim3ActvFl;
+	bool _anim4ActvFl;
+	bool _anim5ActvFl;
+	bool _anim6ActvFl;
+	bool _climbThroughTrapFl;
+	bool _guardFrameFl;
+	bool _sitFl;
+
+	void adjustRails(int variant);
+	void handleJacquesAnim();
+	void climbRightStairs();
+	void climbLeftStairs();
+	void descendRightStairs();
+	void descendLeftStairs();
+	void process_conv_jacques();
+
+public:
+	Scene103(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 
diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index ce8ab37..01430b0 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -814,4 +814,8 @@ void Player::firstWalk(Common::Point fromPos, Facing fromFacing, Common::Point d
 void Player::setWalkTrigger(int val) {
 	warning("TODO: Player::setWalkTrigger");
 }
+
+void Player::resetFacing(Facing facing) {
+	warning("TODO: Player::resetFacing");
+}
 } // End of namespace MADS
diff --git a/engines/mads/player.h b/engines/mads/player.h
index d4b703f..96d5aa8 100644
--- a/engines/mads/player.h
+++ b/engines/mads/player.h
@@ -228,6 +228,9 @@ public:
 	void firstWalk(Common::Point fromPos, Facing fromFacing, Common::Point destPos, Facing destFacing, bool enableFl);
 
 	void setWalkTrigger(int val);
+
+	void resetFacing(Facing facing);
+
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/rails.cpp b/engines/mads/rails.cpp
index 9b2ec71..b69f813 100644
--- a/engines/mads/rails.cpp
+++ b/engines/mads/rails.cpp
@@ -274,4 +274,8 @@ void Rails::synchronize(Common::Serializer &s) {
 	}
 }
 
+void Rails::disableNode(int idx) {
+	warning("TODO: Rails::disableNode");
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/rails.h b/engines/mads/rails.h
index c95f5c4..ef09516 100644
--- a/engines/mads/rails.h
+++ b/engines/mads/rails.h
@@ -127,6 +127,9 @@ public:
 	 * Synchronize the data for the route
 	 */
 	void synchronize(Common::Serializer &s);
+
+	void disableNode(int idx);
+
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 0db0f93..57c93a9 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -60,6 +60,7 @@ Scene::Scene(MADSEngine *vm)
 	_interfaceY = 0;
 	_spritesCount = 0;
 	_variant = 0;
+	_initialVariant = 0;
 
 	_paletteUsageF.push_back(PaletteUsage::UsageEntry(0xF));
 
@@ -610,19 +611,24 @@ void Scene::checkKeyboard() {
 	}
 }
 
-void Scene::loadAnimation(const Common::String &resName, int trigger, int id) {
+int Scene::loadAnimation(const Common::String &resName, int trigger) {
 	// WORKAROUND: If there's already a previous active animation used by the
 	// scene, then free it before we create the new one
-	if ((_vm->getGameID() == GType_RexNebular) && _animation[id])
-		freeAnimation(id);
+	if ((_vm->getGameID() == GType_RexNebular) && _animation[0])
+		freeAnimation(0);
 
 	DepthSurface depthSurface;
 	UserInterface interfaceSurface(_vm);
 
+	warning("TODO: Fix loadAnimation");
+	int id = 0;
+
 	_animation[id] = Animation::init(_vm, this);
 	_animation[id]->load(interfaceSurface, depthSurface, resName,
 		_vm->_dithering ? ANIMFLAG_DITHER : 0, nullptr, nullptr);
 	_animation[id]->startAnimation(trigger);
+
+	return id;
 }
 
 void Scene::updateCursor() {
@@ -744,9 +750,23 @@ void Scene::synchronize(Common::Serializer &s) {
 	s.syncAsByte(_roomChanged);
 	s.syncAsUint16LE(_nextSceneId);
 	s.syncAsUint16LE(_priorSceneId);
+	s.syncAsSint16LE(_initialVariant);
+	s.syncAsSint16LE(_variant);
 	_dynamicHotspots.synchronize(s);
 }
 
+void Scene::setAnimFrame(int id, int val) {
+	if ((id >= 0) && _animation[id])
+		_animation[id]->setCurrentFrame(val);
+}
+
+int Scene::getAnimFrame(int id) {
+	if ((id >= 0) && _animation[id])
+		return _animation[id]->getCurrentFrame();
+
+	return -1;
+}
+
 void Scene::setDynamicAnim(int id, int anim_id, int segment) {
 	warning("TODO: Scene::setDynamicAnim");
 }
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index fd4ed24..57cc794 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -98,6 +98,7 @@ public:
 	int _textSpacing;
 	Hotspots _hotspots;
 	DirtyAreas _dirtyAreas;
+	int _initialVariant;
 	int _variant;
 	SceneInfo *_sceneInfo;
 	MSurface _backgroundSurface;
@@ -214,7 +215,7 @@ public:
 	/**
 	 * Load an animation
 	 */
-	void loadAnimation(const Common::String &resName, int trigger = 0, int id = 0);
+	int loadAnimation(const Common::String &resName, int trigger = 0);
 
 	/**
 	 * Returns a vocab entry
@@ -254,6 +255,9 @@ public:
 	*/
 	void synchronize(Common::Serializer &s);
 
+	void setAnimFrame(int id, int val);
+	int getAnimFrame(int id);
+
 	void setDynamicAnim(int id, int anim_id, int segment);
 	void setCamera(Common::Point pos);
 	void drawToBackground(int series_id, int sprite_id, Common::Point pos, int depth, int scale);
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index 3b261f5..184d710 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -559,4 +559,23 @@ int SequenceList::setTimingTrigger(int delay, int code) {
 	warning("TODO: SequenceList::setTimingTrigger");
 	return -1;
 }
+
+void SequenceList::setRange(int sequence_id, int first, int last) {
+	warning("TODO: SequenceList::setRange");
+}
+
+int SequenceList::addBackwardSequence(int idx, bool flipped, int numTicks, int intervalTicks, int startTicks, int expire) {
+	warning("TODO: SequenceList::addBackwardSequence");
+	return -1;
+}
+
+int SequenceList::setTrigger(int idx, int trigger_type, int trigger_sprite, int trigger_code) {
+	warning("TODO: SequenceList::setTrigger");
+	return -1;
+}
+
+void SequenceList::setSeqPlayer(int idx, bool flag) {
+	warning("TODO: SequenceList::setSeqPlayer");
+}
+
 } // End of namespace
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
index 0343e9c..a1ce3b8 100644
--- a/engines/mads/sequence.h
+++ b/engines/mads/sequence.h
@@ -128,6 +128,10 @@ public:
 
 	int addStampCycle(int srcSpriteIdx, bool flipped, int sprite);
 	int setTimingTrigger(int delay, int code);
+	void setRange(int sequence_id, int first, int last);
+	int addBackwardSequence(int idx, bool flipped, int numTicks, int intervalTicks, int startTicks, int expire);
+	int setTrigger(int sequence_id, int trigger_type, int trigger_sprite, int trigger_code);
+	void setSeqPlayer(int idx, bool flag);
 };
 
 } // End of namespace MADS


Commit: b5167ceef64e225217bf2c02e1a72e7cc85c4145
    https://github.com/scummvm/scummvm/commit/b5167ceef64e225217bf2c02e1a72e7cc85c4145
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-15T11:46:11+02:00

Commit Message:
MADS: Phantom: Fix calls to addSpriteCycle, remove duplicated sequence function

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/sequence.cpp
    engines/mads/sequence.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 979f978..5cb811a 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -1163,7 +1163,7 @@ void Scene103::step() {
 	switch (_game._trigger) {
 	case 65:
 		_scene->deleteSequence(_globals._sequenceIndexes[1]);
-		_globals._sequenceIndexes[1] = _scene->_sequences.addBackwardSequence(_globals._spriteIndexes[1], false, 8, 0, 0, 1);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 		_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 6);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
@@ -1192,7 +1192,7 @@ void Scene103::step() {
 	switch (_game._trigger) {
 	case 100:
 		_scene->deleteSequence(_globals._sequenceIndexes[10]);
-		_globals._sequenceIndexes[10] = _scene->_sequences.addBackwardSequence(_globals._spriteIndexes[10], false, 6, 0, 0, 1);
+		_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 101);
 		_scene->_sequences.setRange(_globals._sequenceIndexes[10], -1, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
@@ -1218,7 +1218,7 @@ void Scene103::step() {
 				_guardFrameFl = true;
 				_scene->deleteSequence(_globals._sequenceIndexes[0]);
 				_scene->deleteSequence(_globals._sequenceIndexes[9]);
-				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 1);
+				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[0], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 105);
@@ -1229,7 +1229,7 @@ void Scene103::step() {
 				_guardFrameFl = true;
 				_scene->deleteSequence(_globals._sequenceIndexes[0]);
 				_scene->deleteSequence(_globals._sequenceIndexes[9]);
-				_globals._sequenceIndexes[0] = _scene->_sequences.addBackwardSequence(_globals._spriteIndexes[0], false, 6, 0, 0, 1);
+				_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[0], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 110);
@@ -1627,7 +1627,7 @@ void Scene103::actions() {
 			case 70:
 				_vm->_sound->command(24);
 				_scene->deleteSequence(_globals._sequenceIndexes[1]);
-				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 1);   
+				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);   
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); 
 				_scene->_sequences.setRange(_globals._sequenceIndexes[1], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 71);
@@ -1650,7 +1650,7 @@ void Scene103::actions() {
 			case (0):
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;  
-				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 0, 0, 1);
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 1);
@@ -1668,7 +1668,7 @@ void Scene103::actions() {
 
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[2]);
-				_globals._sequenceIndexes[2] = _scene->_sequences.addBackwardSequence(_globals._spriteIndexes[2], false, 5, 0, 0, 1);
+				_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 3);
@@ -1763,7 +1763,7 @@ void Scene103::actions() {
 				_anim3ActvFl = false;
 				_climbThroughTrapFl = false;
 				_game._player._stepEnabled = false;
-				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 0, 0, 1);
+				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 5);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[11], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 1);
@@ -1790,7 +1790,7 @@ void Scene103::actions() {
 				_scene->freeAnimation(5);
 				_anim5ActvFl = false;
 				_game._player._stepEnabled = false;
-				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 0, 0, 1);
+				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[10], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 1);
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index 184d710..61848c0 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -564,11 +564,6 @@ void SequenceList::setRange(int sequence_id, int first, int last) {
 	warning("TODO: SequenceList::setRange");
 }
 
-int SequenceList::addBackwardSequence(int idx, bool flipped, int numTicks, int intervalTicks, int startTicks, int expire) {
-	warning("TODO: SequenceList::addBackwardSequence");
-	return -1;
-}
-
 int SequenceList::setTrigger(int idx, int trigger_type, int trigger_sprite, int trigger_code) {
 	warning("TODO: SequenceList::setTrigger");
 	return -1;
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
index a1ce3b8..900458e 100644
--- a/engines/mads/sequence.h
+++ b/engines/mads/sequence.h
@@ -129,7 +129,6 @@ public:
 	int addStampCycle(int srcSpriteIdx, bool flipped, int sprite);
 	int setTimingTrigger(int delay, int code);
 	void setRange(int sequence_id, int first, int last);
-	int addBackwardSequence(int idx, bool flipped, int numTicks, int intervalTicks, int startTicks, int expire);
 	int setTrigger(int sequence_id, int trigger_type, int trigger_sprite, int trigger_code);
 	void setSeqPlayer(int idx, bool flag);
 };


Commit: 1d4e56c455a15f1fa2ae6a927cd272f04a042be3
    https://github.com/scummvm/scummvm/commit/1d4e56c455a15f1fa2ae6a927cd272f04a042be3
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-15T14:56:03+02:00

Commit Message:
MADS: Phantom: Some renaming

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 5cb811a..fc5832d 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -117,40 +117,38 @@ void Scene1xx::setPlayerSpritesPrefix() {
 /*------------------------------------------------------------------------*/
 
 Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) {
-	_execute_chan = -1;
-	_execute_wipe = -1;
-	_brie_calling_position = -1;
-	_brie_chandelier_position = -1;
-	_brie_calling_frame = -1;
-	_brie_chandelier_frame = -1;
-	_converse_counter = 0;
-	_talk_count = -1;
-	_dynamic_brie = 0;
-	_dynamic_brie_2 = 0;
-	_start_walking = false;
-	_start_walking_0 = false;
-	_anim_0_running = false;
-	_anim_1_running = false;
-	_start_sitting_down = false;
+	_chanStatus = -1;
+	_wipeStatus = -1;
+	_callingStatus = -1;
+	_chandelierStatus = -1;
+	_callingFrame = -1;
+	_chandelierFrame = -1;
+	_convCounter = 0;
+	_talkCounter = -1;
+	_brieAnimId = 0;
+	_startWalkingFl = false;
+	_startWalking0Fl = false;
+	_anim0Running = false;
+	_anim1Running = false;
+	_startSittingFl = false;
 }
 
 void Scene101::synchronize(Common::Serializer &s) {
 	Scene1xx::synchronize(s);
-	s.syncAsSint16LE(_execute_chan);
-	s.syncAsSint16LE(_execute_wipe);
-	s.syncAsSint16LE(_brie_calling_position);
-	s.syncAsSint16LE(_brie_chandelier_position);
-	s.syncAsSint16LE(_brie_calling_frame);
-	s.syncAsSint16LE(_brie_chandelier_frame);
-	s.syncAsSint16LE(_converse_counter);
-	s.syncAsSint16LE(_talk_count);
-	s.syncAsSint16LE(_dynamic_brie);
-	s.syncAsSint16LE(_dynamic_brie_2);
-	s.syncAsByte(_start_walking);
-	s.syncAsByte(_start_walking_0);
-	s.syncAsByte(_anim_0_running);
-	s.syncAsByte(_anim_1_running);
-	s.syncAsByte(_start_sitting_down);
+	s.syncAsSint16LE(_chanStatus);
+	s.syncAsSint16LE(_wipeStatus);
+	s.syncAsSint16LE(_callingStatus);
+	s.syncAsSint16LE(_chandelierStatus);
+	s.syncAsSint16LE(_callingFrame);
+	s.syncAsSint16LE(_chandelierFrame);
+	s.syncAsSint16LE(_convCounter);
+	s.syncAsSint16LE(_talkCounter);
+	s.syncAsSint16LE(_brieAnimId);
+	s.syncAsByte(_startWalkingFl);
+	s.syncAsByte(_startWalking0Fl);
+	s.syncAsByte(_anim0Running);
+	s.syncAsByte(_anim1Running);
+	s.syncAsByte(_startSittingFl);
 }
 
 void Scene101::setup() {
@@ -163,10 +161,10 @@ void Scene101::enter() {
 	_vm->_disableFastwalk = true;
 
 	if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
-		_execute_chan = _execute_wipe = -1;
-		_start_walking = _start_walking_0 = false;
-		_anim_0_running = _anim_1_running = false;
-		_start_sitting_down = false;
+		_chanStatus = _wipeStatus = -1;
+		_startWalkingFl = _startWalking0Fl = false;
+		_anim0Running = _anim1Running = false;
+		_startSittingFl = false;
 	}
 
 	// Load Dialogs
@@ -183,46 +181,46 @@ void Scene101::enter() {
 
 	if (_globals[kBrieTalkStatus] == 0) {
 		_game._player.firstWalk(Common::Point(-20, 75), FACING_EAST, Common::Point(18, 79), FACING_EAST, true);
-		_brie_calling_position = 0;
-		_brie_chandelier_position = 3;
+		_callingStatus = 0;
+		_chandelierStatus = 3;
 		_game._player.setWalkTrigger(50);
 
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1);
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 8), 1);
 
-		_anim_0_running  = true;
-		_anim_1_running  = true;
-
-		_dynamic_brie = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots[_dynamic_brie]._articleNumber = PREP_ON;
-		_scene->_dynamicHotspots.setPosition(_dynamic_brie, Common::Point(490, 119), FACING_NONE);
-		_scene->setDynamicAnim(_dynamic_brie, 0, 0);
-		_scene->setDynamicAnim(_dynamic_brie, 0, 1);
-		_scene->setDynamicAnim(_dynamic_brie, 0, 2);
-		_scene->setDynamicAnim(_dynamic_brie, 0, 3);
-		_scene->setDynamicAnim(_dynamic_brie, 0, 4);
-
-		_dynamic_brie_2 = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots[_dynamic_brie_2]._articleNumber = PREP_ON;
-		_scene->_dynamicHotspots.setPosition(_dynamic_brie_2, Common::Point(25, 80), FACING_NONE);
-		_scene->setDynamicAnim(_dynamic_brie_2, 1, 1);
-		_scene->setDynamicAnim(_dynamic_brie_2, 1, 2);
-
-		_talk_count = 0;
+		_anim0Running  = true;
+		_anim1Running  = true;
+
+		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_brieAnimId, Common::Point(490, 119), FACING_NONE);
+		_scene->setDynamicAnim(_brieAnimId, 0, 0);
+		_scene->setDynamicAnim(_brieAnimId, 0, 1);
+		_scene->setDynamicAnim(_brieAnimId, 0, 2);
+		_scene->setDynamicAnim(_brieAnimId, 0, 3);
+		_scene->setDynamicAnim(_brieAnimId, 0, 4);
+
+		int tmpIdx = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(25, 80), FACING_NONE);
+		_scene->setDynamicAnim(tmpIdx, 1, 1);
+		_scene->setDynamicAnim(tmpIdx, 1, 2);
+
+		_talkCounter = 0;
 	} else if (_globals[kBrieTalkStatus] == 1) {
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1);
-		_dynamic_brie = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
-		_scene->_dynamicHotspots[_dynamic_brie]._articleNumber = PREP_ON;
-		_scene->setDynamicAnim(_dynamic_brie, 1, 1);
-		_scene->setDynamicAnim(_dynamic_brie, 1, 2);
-		_anim_1_running = true;
-		_talk_count = 0;
-		_brie_chandelier_position = 3;
+		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
+		_scene->setDynamicAnim(_brieAnimId, 1, 1);
+		_scene->setDynamicAnim(_brieAnimId, 1, 2);
+		_anim1Running = true;
+		_talkCounter = 0;
+		_chandelierStatus = 3;
 
 		if (_vm->_gameConv->_restoreRunning == 1) {
 			_vm->_gameConv->run(1);
 			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
-			_brie_chandelier_position = 4;
+			_chandelierStatus = 4;
 			_scene->setAnimFrame(_globals._animationIndexes[1], 25);
 		}
 	} else if (_scene->_priorSceneId == 202) {
@@ -238,16 +236,16 @@ void Scene101::enter() {
 }
 
 void Scene101::step() {
-	if (_anim_0_running)
+	if (_anim0Running)
 		handleAnimation0();
 
 	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
-		++_converse_counter;
-		if (_converse_counter > 200)
+		++_convCounter;
+		if (_convCounter > 200)
 			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
 	}
 
-	if (_anim_1_running) {
+	if (_anim1Running) {
 		handleAnimation1();
 
 		if (_scene->getAnimFrame(_globals._animationIndexes[1]) == 80) {
@@ -256,32 +254,32 @@ void Scene101::step() {
 		}
 	}
 
-	if (!_start_sitting_down && (_globals[kBrieTalkStatus] != 2)) {
+	if (!_startSittingFl && (_globals[kBrieTalkStatus] != 2)) {
 		warning("TODO: Add a check on view port x > 200");
-		_start_sitting_down = true;
+		_startSittingFl = true;
 		_game._player.walk(Common::Point(490, 119), FACING_NORTHEAST);
 		_game._player._stepEnabled = false;
 		_game._player.setWalkTrigger(55);
-		_brie_chandelier_position = 4;
+		_chandelierStatus = 4;
 	}
 
 	if (_game._trigger == 55) {
 		_game._player._stepEnabled = true;
 		_vm->_gameConv->run(1);
 		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
-		_brie_chandelier_frame = -1;
-		_talk_count = 0;
+		_chandelierFrame = -1;
+		_talkCounter = 0;
 	}
 
 	if (_game._trigger == 50) {
 		_vm->_gameConv->run(0);
-		_brie_calling_position = 1;
+		_callingStatus = 1;
 	}
 }
 
 void Scene101::preActions() {
 	if (_action.isAction(VERB_EXIT_TO, NOUN_ORCHESTRA_PIT)) {
-		if ((_globals[kBrieTalkStatus] == 2) || _start_walking) {
+		if ((_globals[kBrieTalkStatus] == 2) || _startWalkingFl) {
 			_game._player._walkOffScreenSceneId = 102;
 			_globals[kBrieTalkStatus] = 2;
 		} else {
@@ -289,7 +287,7 @@ void Scene101::preActions() {
 			_game._player._needToWalk = false;
 		}
 	} else if (_action.isAction(VERB_EXIT_TO, NOUN_GRAND_FOYER)) {
-		if ((_globals[kBrieTalkStatus] == 2) || _start_walking)
+		if ((_globals[kBrieTalkStatus] == 2) || _startWalkingFl)
 			_game._player._walkOffScreenSceneId = 202;
 		else {
 			_vm->_gameConv->run(0);
@@ -321,7 +319,7 @@ void Scene101::actions() {
 		} else if (_action.isObject(NOUN_SIDE_WALL)) {
 			_vm->_dialogs->show(10115);
 		} else if (_action.isObject(NOUN_SEATS)) {
-			if ((_globals[kBrieTalkStatus] > 1) || _start_walking)
+			if ((_globals[kBrieTalkStatus] > 1) || _startWalkingFl)
 				_vm->_dialogs->show(10119);
 			else
 				_vm->_dialogs->show(10116);
@@ -346,7 +344,7 @@ void Scene101::handleConversation0() {
 
 	if (_game._trigger == 90) {
 		_globals[kBrieTalkStatus] = 1;
-		_start_walking_0 = true;
+		_startWalking0Fl = true;
 	}  
 }
 
@@ -357,19 +355,19 @@ void Scene101::handleConversation1() {
 		if (_game._trigger == 60) {
 			switch (_action._activeAction._verbId) {
 			case 0:
-				_brie_chandelier_position = 6;
-				_execute_wipe = 2;
+				_chandelierStatus = 6;
+				_wipeStatus = 2;
 				break;
 
 			case 1:
-				_brie_chandelier_position = 2;
-				_execute_chan = 9;
+				_chandelierStatus = 2;
+				_chanStatus = 9;
 				break;
 
 			case 4:
-				_brie_chandelier_position = 0;
-				_execute_chan = -1;
-				_execute_wipe = -1;
+				_chandelierStatus = 0;
+				_chanStatus = -1;
+				_wipeStatus = -1;
 				break;
 
 			case 8:
@@ -377,18 +375,18 @@ void Scene101::handleConversation1() {
 			case 18:
 			case 22:
 			case 24:
-				_start_walking = true;
-				_execute_chan = -1;
-				_execute_wipe = -1;
+				_startWalkingFl = true;
+				_chanStatus = -1;
+				_wipeStatus = -1;
 				_globals[kWalkerConverse] = 0;
 				_vm->_gameConv->setInterlocutorTrigger(105);
 				interlocutorFl = true;
 				break;
 
 			case 12:
-				_brie_chandelier_position = 5;
-				_execute_chan = -1;
-				_execute_wipe = -1;
+				_chandelierStatus = 5;
+				_chanStatus = -1;
+				_wipeStatus = -1;
 				break;
 
 			default:
@@ -401,21 +399,21 @@ void Scene101::handleConversation1() {
 
 		_vm->_gameConv->setHeroTrigger(70);
 
-		_talk_count = 0;
+		_talkCounter = 0;
 
 		if (_game._trigger == 60) {
-			if (!_start_walking)
+			if (!_startWalkingFl)
 				_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
 
-			_brie_chandelier_position = 2;
-		} else if ((_game._trigger == 70) && !_start_walking) {
-			_brie_chandelier_position = 4;
-			_execute_chan = -1;
-			_execute_wipe = -1;
-			if (!_start_walking)
+			_chandelierStatus = 2;
+		} else if ((_game._trigger == 70) && !_startWalkingFl) {
+			_chandelierStatus = 4;
+			_chanStatus = -1;
+			_wipeStatus = -1;
+			if (!_startWalkingFl)
 				_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
 
-			_converse_counter = 0;
+			_convCounter = 0;
 		}
 	}
 }
@@ -424,65 +422,65 @@ void Scene101::handleAnimation0() {
 	int random;
 	int reset_frame;
 
-	if (_scene->getAnimFrame(_globals._animationIndexes[0]) != _brie_calling_frame) {
-		_brie_calling_frame = _scene->getAnimFrame(_globals._animationIndexes[0]);
+	if (_scene->getAnimFrame(_globals._animationIndexes[0]) != _callingFrame) {
+		_callingFrame = _scene->getAnimFrame(_globals._animationIndexes[0]);
 		reset_frame = -1;
-		switch (_brie_calling_frame) {
+		switch (_callingFrame) {
 		case 1:
 		case 9:
 		case 12:
-			if (_brie_calling_position == 1) {
-				if (_brie_calling_frame == 9) {
-					if (_start_walking_0) {
+			if (_callingStatus == 1) {
+				if (_callingFrame == 9) {
+					if (_startWalking0Fl) {
 						reset_frame = 13;
-						_brie_calling_position = 3;
+						_callingStatus = 3;
 					} else
-						_brie_calling_position = 2;
+						_callingStatus = 2;
 				} else
 					reset_frame = 1;
 			}
 
-			if (_brie_calling_position == 0) {
-				if (_start_walking_0) {
+			if (_callingStatus == 0) {
+				if (_startWalking0Fl) {
 					reset_frame = 60;
-					_brie_calling_position = 3;
+					_callingStatus = 3;
 				} else
 					reset_frame = 0;
 			}
 
-			if (_brie_calling_position == 2) {
-				if (_start_walking_0) {
+			if (_callingStatus == 2) {
+				if (_startWalking0Fl) {
 					reset_frame = 13;
-					_brie_calling_position = 3;
+					_callingStatus = 3;
 				} else {
 					random = _vm->getRandomNumber(1, 2);
-					++_talk_count;
+					++_talkCounter;
 
-					if (_talk_count < 18) {
+					if (_talkCounter < 18) {
 						if (random == 1)
 							reset_frame = 7;
 						else
 							reset_frame = 10;
 					} else {
 						reset_frame = 54;
-						_brie_calling_position = 0;
+						_callingStatus = 0;
 					}
 				}
 			}
 			break;
 
 		case 53:
-			_anim_0_running    = false;
+			_anim0Running    = false;
 			_scene->freeAnimation(0);
 			break;
 
 		case 59:  
-			if (_start_walking_0) {
+			if (_startWalking0Fl) {
 				reset_frame = 60;
-				_brie_calling_position = 3;
+				_callingStatus = 3;
 			} else {
 				reset_frame = 0;
-				_brie_calling_position = 0;
+				_callingStatus = 0;
 			}
 			break;
 
@@ -493,7 +491,7 @@ void Scene101::handleAnimation0() {
 
 		if (reset_frame >= 0) {
 			_scene->setAnimFrame(_globals._animationIndexes[0], reset_frame);
-			_brie_calling_frame = reset_frame;
+			_callingFrame = reset_frame;
 		}
 	}
 } 
@@ -502,12 +500,12 @@ void Scene101::handleAnimation1() {
 	int random;
 	int reset_frame;
 
-	if (_scene->getAnimFrame(_globals._animationIndexes[1]) != _brie_chandelier_frame) {
-		_brie_chandelier_frame = _scene->getAnimFrame(_globals._animationIndexes[1]);
+	if (_scene->getAnimFrame(_globals._animationIndexes[1]) != _chandelierFrame) {
+		_chandelierFrame = _scene->getAnimFrame(_globals._animationIndexes[1]);
 		reset_frame = -1;
-		switch (_brie_chandelier_frame) {
+		switch (_chandelierFrame) {
 		case 1:
-			if (_brie_chandelier_position == 3)
+			if (_chandelierStatus == 3)
 				reset_frame = 0;
 			break;
 
@@ -518,30 +516,30 @@ void Scene101::handleAnimation1() {
 		case 26:
 		case 44:
 		case 333:
-			if (_talk_count == _execute_chan) {
-				_brie_chandelier_position = 0;
-				++_talk_count;
-				_execute_chan = -1;
+			if (_talkCounter == _chanStatus) {
+				_chandelierStatus = 0;
+				++_talkCounter;
+				_chanStatus = -1;
 			} 
 
-			if (_talk_count == _execute_wipe) {
-				_brie_chandelier_position = 6;
-				++_talk_count;
-				_execute_wipe = -1;
+			if (_talkCounter == _wipeStatus) {
+				_chandelierStatus = 6;
+				++_talkCounter;
+				_wipeStatus = -1;
 			}
 
-			if (_start_walking) {
+			if (_startWalkingFl) {
 				if (_vm->_gameConv->_running == 1) {
-					if (_talk_count > 13)
-						_brie_chandelier_position = 1;
+					if (_talkCounter > 13)
+						_chandelierStatus = 1;
 				} else
-					_brie_chandelier_position = 1;
+					_chandelierStatus = 1;
 			}
 
-			switch (_brie_chandelier_position) {
+			switch (_chandelierStatus) {
 			case 0:
 				reset_frame = 27;
-				_brie_chandelier_position = 2;
+				_chandelierStatus = 2;
 				break;
 
 			case 1:
@@ -549,14 +547,14 @@ void Scene101::handleAnimation1() {
 				reset_frame = 45;
 				if (_vm->_gameConv->_running == 1)
 					_vm->_gameConv->stop();
-				_scene->_dynamicHotspots.remove(_dynamic_brie);
+				_scene->_dynamicHotspots.remove(_brieAnimId);
 				_game._player._stepEnabled = false;
 				break;
 
 			case 2:
 				random = _vm->getRandomNumber(1, 3);
-				++_talk_count;
-				if (_talk_count < 15) {
+				++_talkCounter;
+				if (_talkCounter < 15) {
 					if (random == 1)
 						reset_frame = 12;
 					else if (random == 2)
@@ -564,7 +562,7 @@ void Scene101::handleAnimation1() {
 					else if (random == 3)
 						reset_frame = 17;
 				} else {
-					_brie_chandelier_position = 4;
+					_chandelierStatus = 4;
 					reset_frame = 25;
 				}
 				break;
@@ -575,12 +573,12 @@ void Scene101::handleAnimation1() {
 
 			case 5:
 				reset_frame = 21;
-				_brie_chandelier_position = 2;
+				_chandelierStatus = 2;
 				break;
 
 			case 6:
 				reset_frame = 316;
-				_brie_chandelier_position = 2;
+				_chandelierStatus = 2;
 				break;
 
 			default:
@@ -595,7 +593,7 @@ void Scene101::handleAnimation1() {
 
 		if (reset_frame >= 0) {
 			_scene->setAnimFrame(_globals._animationIndexes[1], reset_frame);
-			_brie_chandelier_frame = reset_frame;
+			_chandelierFrame = reset_frame;
 		}
 	}
 }
@@ -603,13 +601,13 @@ void Scene101::handleAnimation1() {
 /*------------------------------------------------------------------------*/
 
 Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) {
-	_anim0RunningFl = false;
+	_anim0Running = false;
 }
 
 void Scene102::synchronize(Common::Serializer &s) {
 	Scene1xx::synchronize(s);
 
-	s.syncAsByte(_anim0RunningFl);
+	s.syncAsByte(_anim0Running);
 }
 
 void Scene102::setup() {
@@ -618,7 +616,7 @@ void Scene102::setup() {
 }
 
 void Scene102::enter() {
-	_anim0RunningFl = false;
+	_anim0Running = false;
 
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RAL86");
@@ -679,7 +677,7 @@ void Scene102::enter() {
 	} else if (_scene->_priorSceneId == 103 || _scene->_priorSceneId != -1) {
 		_game._player._playerPos = Common::Point(282, 145);
 		_game._player._facing = FACING_WEST;
-		_anim0RunningFl = true;
+		_anim0Running = true;
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 60);
 	} else if (_scene->_priorSceneId == -1) {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
@@ -694,7 +692,7 @@ void Scene102::step() {
 		// Door closes
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
-		_anim0RunningFl = false;
+		_anim0Running = false;
 	} else if (_game._trigger == 65) {
 		// Death
 		if (_globals[kDeathLocation] == 0)
@@ -718,7 +716,7 @@ void Scene102::actions() {
 	} else if (_action.isAction(VERB_WALK_THROUGH, NOUN_ORCHESTRA_DOOR) ||
 		_action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR) ||
 		_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR)) {
-		if (_anim0RunningFl) {
+		if (_anim0Running) {
 			_scene->_sequences.setTimingTrigger(15, 70);
 			_game._player._stepEnabled = false;
 		} else {
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index f978fa4..173f6c5 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -55,21 +55,20 @@ public:
 
 class Scene101 : public Scene1xx {
 private:
-	int _execute_chan;
-	int _execute_wipe;
-	int _brie_calling_position;
-	int _brie_chandelier_position;
-	int _brie_calling_frame;
-	int _brie_chandelier_frame;
-	int _talk_count;
-	int _converse_counter;
-	int _dynamic_brie;
-	int _dynamic_brie_2;
-	bool _start_walking;
-	bool _start_walking_0;
-	bool _anim_0_running;
-	bool _anim_1_running;
-	bool _start_sitting_down;
+	int _chanStatus;
+	int _wipeStatus;
+	int _callingStatus;
+	int _chandelierStatus;
+	int _callingFrame;
+	int _chandelierFrame;
+	int _talkCounter;
+	int _convCounter;
+	int _brieAnimId;
+	bool _startWalkingFl;
+	bool _startWalking0Fl;
+	bool _anim0Running;
+	bool _anim1Running;
+	bool _startSittingFl;
 public:
 	Scene101(MADSEngine *vm);
 	virtual void synchronize(Common::Serializer &s);
@@ -88,7 +87,7 @@ public:
 
 class Scene102 : public Scene1xx {
 private:
-	bool _anim0RunningFl;
+	bool _anim0Running;
 
 public:
 	Scene102(MADSEngine *vm);


Commit: 2c59f4932efa4338c45bf4e3824a6b5cbd0ff4d1
    https://github.com/scummvm/scummvm/commit/2c59f4932efa4338c45bf4e3824a6b5cbd0ff4d1
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-16T15:44:35+02:00

Commit Message:
MADS: Phantom: Implement logic for scene 104

Changed paths:
    engines/mads/conversations.cpp
    engines/mads/conversations.h
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp
index 52a6404..ada740d 100644
--- a/engines/mads/conversations.cpp
+++ b/engines/mads/conversations.cpp
@@ -65,4 +65,13 @@ int* GameConversation::getVariable(int idx) {
 	warning("TODO: GameConversation::getVariable");
 	return nullptr;
 }
+
+void GameConversation::hold() {
+	warning("TODO: GameConversation::hold");
+}
+
+void GameConversation::release() {
+	warning("TODO: GameConversation::release");
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/conversations.h b/engines/mads/conversations.h
index 225fc4f..48d054f 100644
--- a/engines/mads/conversations.h
+++ b/engines/mads/conversations.h
@@ -51,6 +51,8 @@ public:
 	void exportValue(int val);
 	void setHeroTrigger(int val);
 	void setInterlocutorTrigger(int val);
+	void hold();
+	void release();
 
 	int _running;
 	int _restoreRunning;
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index fc5832d..7d6ba22 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -345,7 +345,7 @@ void Scene101::handleConversation0() {
 	if (_game._trigger == 90) {
 		_globals[kBrieTalkStatus] = 1;
 		_startWalking0Fl = true;
-	}  
+	}
 }
 
 void Scene101::handleConversation1() {
@@ -474,7 +474,7 @@ void Scene101::handleAnimation0() {
 			_scene->freeAnimation(0);
 			break;
 
-		case 59:  
+		case 59:
 			if (_startWalking0Fl) {
 				reset_frame = 60;
 				_callingStatus = 3;
@@ -494,7 +494,7 @@ void Scene101::handleAnimation0() {
 			_callingFrame = reset_frame;
 		}
 	}
-} 
+}
 
 void Scene101::handleAnimation1() {
 	int random;
@@ -520,7 +520,7 @@ void Scene101::handleAnimation1() {
 				_chandelierStatus = 0;
 				++_talkCounter;
 				_chanStatus = -1;
-			} 
+			}
 
 			if (_talkCounter == _wipeStatus) {
 				_chandelierStatus = 6;
@@ -674,7 +674,7 @@ void Scene102::enter() {
 		_scene->_sequences.setTimingTrigger(120, 65);
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
-	} else if (_scene->_priorSceneId == 103 || _scene->_priorSceneId != -1) {
+	} else if (_scene->_priorSceneId == 103 || _scene->_priorSceneId != RETURNING_FROM_LOADING) {
 		_game._player._playerPos = Common::Point(282, 145);
 		_game._player._facing = FACING_WEST;
 		_anim0Running = true;
@@ -864,7 +864,7 @@ void Scene103::setup() {
 }
 
 void Scene103::enter() {
-	if (_scene->_priorSceneId != -1) {
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
 		_anim0ActvFl = false;
 		_anim1ActvFl = false;
 		_anim2ActvFl = false;
@@ -875,7 +875,7 @@ void Scene103::enter() {
 		_climbThroughTrapFl = false;
 		_guardFrameFl = false;
 		_sitFl = false;
-		_jacquesAction = 1; 
+		_jacquesAction = 1;
 		_lastRandom = 0;
 		_standPosition = 0;
 	}
@@ -939,15 +939,15 @@ void Scene103::enter() {
 
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 
 		} else {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 
 			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1) ; 
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1) ;
 		}
 
 		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(121, 79, 40, 63));
@@ -1030,7 +1030,7 @@ void Scene103::enter() {
 	} else if (_globals[kPrompterStandStatus] == 0) {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
-		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); 
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
 
 		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(2, 79, 40, 63));
 		_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
@@ -1083,8 +1083,8 @@ void Scene103::enter() {
 
 			_scene->deleteSequence(_globals._sequenceIndexes[3]);
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);  
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 		}
 
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
@@ -1095,7 +1095,7 @@ void Scene103::enter() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 
-	} else if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId != -1)) {
+	} else if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
 		_game._player._playerPos = Common::Point(287, 135);
 		_game._player._facing = FACING_WEST;
 		_game._player._stepEnabled = false;
@@ -1115,8 +1115,8 @@ void Scene103::enter() {
 
 			_scene->deleteSequence(_globals._sequenceIndexes[3]);
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);  
-			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 			_game._player._visible = false;
 			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 0);
 			_anim3ActvFl = true;
@@ -1166,13 +1166,13 @@ void Scene103::step() {
 		_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 6);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
 		_vm->_sound->command(66);
-		break; 
+		break;
 
 	case 66: {
 		int syncIdx = _globals._sequenceIndexes[1];
 		_vm->_sound->command(25);
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
-		_game.syncTimers(1, _globals._sequenceIndexes[1], 1, syncIdx); 
+		_game.syncTimers(1, _globals._sequenceIndexes[1], 1, syncIdx);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 		_game._player._stepEnabled = true;
 		}
@@ -1194,7 +1194,7 @@ void Scene103::step() {
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 101);
 		_scene->_sequences.setRange(_globals._sequenceIndexes[10], -1, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
-		break; 
+		break;
 
 	case 101:
 		_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0);
@@ -1385,7 +1385,7 @@ void Scene103::actions() {
 		process_conv_jacques();
 		_action._inProgress = false;
 		return;
-	} 
+	}
 
 	if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) {
 		if (_globals[kTrapDoorStatus] == 1) {
@@ -1412,9 +1412,9 @@ void Scene103::actions() {
 			if (_game._trigger == 0) {
 				if (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX)) {
 					_sitFl = true;
-					_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 115); 
+					_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 115);
 				} else
-					_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0); 
+					_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0);
 
 				_game._player._visible = false;
 				_game._player._stepEnabled = false;
@@ -1464,10 +1464,10 @@ void Scene103::actions() {
 				case 75:
 					if (_globals[kPrompterStandStatus] == 0) {
 						_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
-						_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1) ; 
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1) ;
 						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
-						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 						_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[0]);
 						_globals[kPrompterStandStatus] = 1;
 						_game._player._stepEnabled = true;
@@ -1538,7 +1538,7 @@ void Scene103::actions() {
 					if (_globals[kPrompterStandStatus] == 1) {
 						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
-						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); 
+						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
 						_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[0]);
 						_globals[kPrompterStandStatus] = 0;
 						_game._player._stepEnabled = true;
@@ -1613,7 +1613,7 @@ void Scene103::actions() {
 
 			case 2:
 				_game._player._visible = true;
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]); 
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
 				_game._player.walk(Common::Point(295, 132), FACING_WEST);
 				_scene->_sequences.setTimingTrigger(180, 3);
 				break;
@@ -1625,17 +1625,17 @@ void Scene103::actions() {
 			case 70:
 				_vm->_sound->command(24);
 				_scene->deleteSequence(_globals._sequenceIndexes[1]);
-				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);   
-				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); 
+				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[1], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 71);
 				_vm->_sound->command(66);
-				break; 
+				break;
 
 			case 71: {
 				int oldIdx = _globals._sequenceIndexes[1];
 				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2);
-				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, oldIdx); 
+				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, oldIdx);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 				}
 				break;
@@ -1647,7 +1647,7 @@ void Scene103::actions() {
 			switch (_game._trigger) {
 			case (0):
 				_game._player._stepEnabled = false;
-				_game._player._visible = false;  
+				_game._player._visible = false;
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
@@ -1657,12 +1657,12 @@ void Scene103::actions() {
 			case 1: {
 				int oldIdx = _globals._sequenceIndexes[2];
 				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, oldIdx); 
+				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, oldIdx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
 				_scene->_sequences.setTimingTrigger(15, 2);
 				_vm->_sound->command(73);
 				}
-				break; 
+				break;
 
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[2]);
@@ -1673,7 +1673,7 @@ void Scene103::actions() {
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]); 
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
 				_game._player._visible = true;
 				if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
 					_vm->_dialogs->show(00032);
@@ -1695,7 +1695,7 @@ void Scene103::actions() {
 		switch (_game._trigger) {
 		case (0):
 			_game._player._stepEnabled = false;
-			_game._player._visible = false;  
+			_game._player._visible = false;
 			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 0, 0, 2);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[8], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
@@ -1715,7 +1715,7 @@ void Scene103::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
 			_game._player._visible = true;
 			_scene->_sequences.setTimingTrigger(20, 3);
 			_action._inProgress = false;
@@ -1778,7 +1778,7 @@ void Scene103::actions() {
 		}
 		_action._inProgress = false;
 		return;
-	}    
+	}
 
 	if (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) || _sitFl) {
 		if (_standPosition == 1) {
@@ -1811,7 +1811,7 @@ void Scene103::actions() {
 	}
 
 	if (_action.isAction(VERB_PUSH, NOUN_LEVER) || _action.isAction(VERB_PULL, NOUN_LEVER)) {
-		if (_globals[kTrapDoorStatus] == 1) { 
+		if (_globals[kTrapDoorStatus] == 1) {
 			switch (_game._trigger) {
 			case 0:
 				_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('l', 1), 1);
@@ -1824,7 +1824,7 @@ void Scene103::actions() {
 			case 1:
 				_anim1ActvFl    = false;
 				_game._player._visible = true;
-				_globals[kTrapDoorStatus] = 0; 
+				_globals[kTrapDoorStatus] = 0;
 				_game._player._stepEnabled = true;
 				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
 				break;
@@ -1845,7 +1845,7 @@ void Scene103::actions() {
 			case 1:
 				_anim2ActvFl = false;
 				_game._player._visible = true;
-				_globals[kTrapDoorStatus] = 1; 
+				_globals[kTrapDoorStatus] = 1;
 				_game._player._stepEnabled = true;
 				_game.syncTimers(2, 0, 3, _globals._animationIndexes[2]);
 				break;
@@ -2173,14 +2173,14 @@ void Scene103::handleJacquesAnim() {
 		}
 		break;
 
-	case 36:    
-	case 40:    
-	case 48:    
+	case 36:
+	case 40:
+	case 48:
 		switch (_jacquesAction) {
 		case 0:
 		case 2:
 		case 3:
-			random = 2; 
+			random = 2;
 			break;
 
 		case 4:
@@ -2199,23 +2199,23 @@ void Scene103::handleJacquesAnim() {
 		switch (random) {
 		case 1:
 			resetFrame = 37;
-			break; 
+			break;
 
 		case 2:
 			resetFrame = 49;
-			break; 
+			break;
 
 		case 3:
 			resetFrame = 41;
-			break; 
+			break;
 
 		default:
 			resetFrame = 35;
-			break; 
+			break;
 		}
 		break;
 
-	case 44:   
+	case 44:
 		random = _vm->getRandomNumber(1, 50);
 		while (_lastRandom == random) {
 			random = _vm->getRandomNumber(1, 50);
@@ -2227,7 +2227,7 @@ void Scene103::handleJacquesAnim() {
 		case 2:
 		case 3:
 		case 4:
-			random = 1; 
+			random = 1;
 			break;
 
 		default:
@@ -2241,11 +2241,11 @@ void Scene103::handleJacquesAnim() {
 		switch (random) {
 		case 1:
 			resetFrame = 45;
-			break; 
+			break;
 
 		default:
 			resetFrame = 43;
-			break; 
+			break;
 		}
 		break;
 	}
@@ -2272,8 +2272,8 @@ void Scene103::climbRightStairs() {
 	if (_lastStairFrame == 2) {
 		_scene->deleteSequence(3);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
-		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); 
-		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 	}
 
 	if (stairs_reset_frame >= 0) {
@@ -2298,8 +2298,8 @@ void Scene103::climbLeftStairs() {
 	if (_lastStairFrame == 2) {
 		_scene->deleteSequence(3);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
-		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); 
-		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); 
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
 	}
 
 	if (stairs_reset_frame >= 0) {
@@ -2319,8 +2319,8 @@ void Scene103::descendRightStairs() {
 	if (_lastStairFrame == 2) {
 		_scene->deleteSequence(3);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
-		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);  
-		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); 
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 	}
 
 	if (stairs_reset_frame >= 0) {
@@ -2340,8 +2340,8 @@ void Scene103::descendLeftStairs() {
 	if (_lastStairFrame == 2) {
 		_scene->deleteSequence(3);
 		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
-		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);  
-		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); 
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
 	}
 
 	if (stairs_reset_frame >= 0) {
@@ -2442,5 +2442,1189 @@ void Scene103::process_conv_jacques() {
 
 /*------------------------------------------------------------------------*/
 
+Scene104::Scene104(MADSEngine *vm) : Scene1xx(vm) {
+	_anim0ActvFl = _anim1ActvFl = _anim2ActvFl = false;
+	_needToTalk = false;
+	_needToGetUp = false;
+	_sittingUp = false;
+	_beforeHeLeaves = false;
+	_beforeSheLeaves = false;
+	_needToStandUp = false;
+
+	_walkStatus = -1;
+	_walkFrame = -1;
+	_coupleStatus = -1;
+	_richStatus = -1;
+	_richTalkCount = -1;
+	_manTalkCount = -1;
+	_womanTalkCount = -1;
+	_lookCount = -1;
+	_coupleFrame = -1;
+	_lastPlayerFrame = -1;
+	_richFrame = -1;
+}
+
+void Scene104::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_needToTalk);
+	s.syncAsByte(_needToGetUp);
+	s.syncAsByte(_sittingUp);
+	s.syncAsByte(_beforeHeLeaves);
+	s.syncAsByte(_beforeSheLeaves);
+	s.syncAsByte(_needToStandUp);
+
+	s.syncAsSint16LE(_walkStatus);
+	s.syncAsSint16LE(_walkFrame);
+	s.syncAsSint16LE(_coupleStatus);
+	s.syncAsSint16LE(_richStatus);
+	s.syncAsSint16LE(_richTalkCount);
+	s.syncAsSint16LE(_manTalkCount);
+	s.syncAsSint16LE(_womanTalkCount);
+	s.syncAsSint16LE(_lookCount);
+	s.syncAsSint16LE(_coupleFrame);
+	s.syncAsSint16LE(_lastPlayerFrame);
+}
+
+void Scene104::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if (_globals[kTrapDoorStatus] == 1)
+		_scene->_initialVariant = 1;
+
+	_scene->addActiveVocab(NOUN_MONSIEUR_RICHARD);
+}
+
+void Scene104::enter() {
+	_vm->_disableFastwalk = true;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+		_needToTalk = false;
+		_needToGetUp = false;
+		_sittingUp = false;
+		_beforeSheLeaves = false;
+		_needToStandUp = false;
+	}
+
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 6), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+
+	if (_globals[kCurrentYear] == 1993)
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 0), false);
+
+	_vm->_gameConv->get(7);
+
+	if (_globals[kTrapDoorStatus] == 1) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 15);
+	} else {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 15);
+	}
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		if (_vm->_gameConv->_restoreRunning == 7) {
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1);
+			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('d', 1), 1);
+			_walkStatus = 0;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 1);
+			if (_coupleStatus < 11) {
+				_coupleStatus = 1;
+				_richStatus = 0;
+				_scene->setAnimFrame(_globals._animationIndexes[1], 14);
+			} else {
+				_coupleStatus = 17;
+				_richStatus = 4;
+				_scene->setAnimFrame(_globals._animationIndexes[1], 105);
+				_scene->setAnimFrame(_globals._animationIndexes[0], 216);
+			}
+
+			_vm->_gameConv->run(7);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_game._player._visible = false;
+		}
+
+	} else if (_scene->_priorSceneId == 301) {
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1);
+		_anim1ActvFl = true;
+		_coupleStatus = 11;
+
+		_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('d', 1), 1);
+		_anim2ActvFl = true;
+		_walkStatus = 0;
+
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 1);
+		_anim0ActvFl = true;
+		_richStatus = 0;
+
+		cleanInventory ();
+
+		_game._player._visible = false;
+		_game._visitedScenes.pop_back();
+		_globals[kTrapDoorStatus] = 1;
+		_globals[kCurrentYear] = 1881;
+		_globals[kPrompterStandStatus] = 1;
+		_globals[kTicketPeoplePresent] = 1;
+		_globals[kMakeBrieLeave203] = false;
+		_game._player._playerPos.x = 161;
+
+		_game._visitedScenes.add(301);
+		_game._visitedScenes.add(101);
+
+		_scene->setCamera(Common::Point(60, 0));
+		_scene->_sequences.setTimingTrigger(1, 91);
+
+	} else if (_scene->_priorSceneId == 103) {
+		if (_globals[kRoom103104Transition] == 0) {
+			_scene->_userInterface.emptyConversationList();
+			_scene->_userInterface.setup(kInputConversation);
+
+			if (!_globals[kObservedPhan104]) {
+				_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 1), 93);
+				_game._player._playerPos.x = 319;
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_scene->setCamera(Common::Point(158, 0));
+			} else {
+				_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('p', 2), 94);
+				_game._player._playerPos.x = 319;
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_scene->setCamera(Common::Point(158, 0));
+			}
+		} else {
+			_game._player._playerPos = Common::Point(319, 96);
+			_game._player._facing = FACING_SOUTH;
+			_scene->setCamera(Common::Point(158, 0));
+		}
+	} else if (_scene->_priorSceneId == 102) {
+		switch (_globals[kDeathLocation]) {
+		case 0:
+			_game._player._playerPos = Common::Point(496, 79);
+			_scene->setCamera(Common::Point(320, 0));
+			break;
+
+		case 1:
+			_game._player._playerPos = Common::Point(346, 71);
+			_scene->setCamera(Common::Point(158, 0));
+			break;
+
+		case 2:
+			_game._player._playerPos = Common::Point(172, 73);
+			break;
+
+		default:
+			break;
+		}
+	} else if (_scene->_priorSceneId == 108) {
+		if (_game._player._playerPos.x > 213)
+			_game._player._playerPos.y = 97;
+		else if (_game._player._playerPos.x > 110)
+			_game._player._playerPos.y = 128;
+		else
+			_game._player._playerPos.y = 148;
+
+		_game._player.firstWalk(Common::Point(-20, _game._player._playerPos.y), FACING_EAST, Common::Point(12, _game._player._playerPos.y), FACING_EAST, true);
+	} else if ((_scene->_priorSceneId == 107) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		if (_game._player._playerPos.x > 191)
+			_game._player._playerPos.y = 142;
+		else if (_game._player._playerPos.x > 104)
+			_game._player._playerPos.y = 120;
+		else
+			_game._player._playerPos.y = 95;
+
+		_game._player.firstWalk(Common::Point(655, _game._player._playerPos.y), FACING_WEST, Common::Point(627, _game._player._playerPos.y), FACING_WEST, true);
+		_scene->setCamera(Common::Point(320, 0));
+	}
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	} else
+		_scene->_hotspots.activate(NOUN_CHANDELIER, false);
+
+	if (_globals[kTrapDoorStatus] == 1) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 15);
+	} else {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 15);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene104::step() {
+	if (_anim0ActvFl)
+		handleRichAnimations();
+
+	if (_anim1ActvFl)
+		handleCoupleAnimations();
+
+	if (_anim2ActvFl)
+		handleWalkAnimation();
+
+	if (_game._player._moving)
+		handlePlayerWalk();
+
+	if (_game._trigger == 91) {
+		_vm->_dialogs->show(10434);
+		_vm->_gameConv->run(7);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+	}
+
+	if (_game._trigger == 93) {
+		_scene->_nextSceneId = 103;
+		_game._player._playerPos.x = 400;
+		_globals[kRoom103104Transition] = 0;
+	}
+
+	if (_game._trigger == 94) {
+		_scene->_nextSceneId = 103;
+		_globals[kRoom103104Transition] = 0;
+	}
+}
+
+void Scene104::preActions() {
+	if (_action.isAction(NOUN_EXIT, NOUN_STAGE_LEFT))
+		_game._player._walkOffScreenSceneId = 108;
+
+	if (_action.isAction(NOUN_EXIT, NOUN_STAGE_RIGHT))
+		_game._player._walkOffScreenSceneId = 107;
+
+	if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR) || _action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR))
+		_game._player.walk(Common::Point(320, 92), FACING_NORTH);
+}
+
+void Scene104::actions() {
+	if (_vm->_gameConv->_running == 7) {
+		processConversations();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) {
+		if (_globals[kTrapDoorStatus] == 0) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._visible = false;
+				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 16);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
+				break;
+
+			case 60:
+				_scene->_nextSceneId = 103;
+				_globals[kRoom103104Transition] = 1;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			_vm->_dialogs->show(10429);
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_JUMP_INTO, NOUN_ORCHESTRA_PIT)) {
+		switch (_game._trigger) {
+		case 0:
+			if (_game._player._playerPos.x > 400)
+				_globals[kDeathLocation] = 0;
+			else if (_game._player._playerPos.x > 200)
+				_globals[kDeathLocation] = 1;
+			else
+				_globals[kDeathLocation] = 2;
+
+			_scene->changeVariant(2);
+
+			if (_globals[kTrapDoorStatus] == 1)
+				_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+			else
+				_scene->drawToBackground(_globals._spriteIndexes[0], 2, Common::Point(-32000, -32000), 0, 100);
+
+			_vm->_dialogs->show(10426);
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0, 0, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[3], -1, 4);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			break;
+
+		case 1:
+			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 1, 0, 0, 10);
+			_scene->_sequences.setTimingTrigger(60, 2);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[3], 4, 4);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
+			_scene->_sequences.setMotion(_globals._sequenceIndexes[3], 0, 0, 200);
+			break;
+
+		case 2:
+			_vm->_sound->command(1);
+			_vm->_sound->command(67);
+			_scene->_nextSceneId = 102;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(10410);
+		else
+			_vm->_dialogs->show(10411);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_STAGE)) {
+			_vm->_dialogs->show(10412);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_APRON)) {
+			_vm->_dialogs->show(10413);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROSCENIUM_ARCH)) {
+			_vm->_dialogs->show(10414);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_ACT_CURTAIN)) {
+			_vm->_dialogs->show(10415);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_ORCHESTRA_PIT)) {
+			_vm->_dialogs->show(10416);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CONDUCTORS_STAND)) {
+			_vm->_dialogs->show(10417);
+			_action._inProgress = false;
+			return;
+		}
+
+		if ((_action.isAction(NOUN_MUSIC_STAND)) || (_action.isAction(NOUN_MUSIC_STANDS))) {
+			_vm->_dialogs->show(10418);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROMPTERS_BOX)) {
+			_vm->_dialogs->show(10419);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_TRAP_DOOR)) {
+			_vm->_dialogs->show(10420);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_HOUSE)) {
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->show(10421);
+			else
+				_vm->_dialogs->show(10427);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGE_LEFT)) {
+			_vm->_dialogs->show(10422);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGE_RIGHT)) {
+			_vm->_dialogs->show(10423);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CHANDELIER)) {
+			_vm->_dialogs->show(10428);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_MONSIEUR_RICHARD)) {
+			_vm->_dialogs->show(10433);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_JUMP_INTO, NOUN_ORCHESTRA_PIT)) {
+		_vm->_dialogs->show(10426);
+		_scene->_nextSceneId = 102;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_PROMPTERS_BOX) || _action.isAction(VERB_CLOSE, NOUN_PROMPTERS_BOX)) {
+		_vm->_dialogs->show(10430);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) {
+		if (_globals[kTrapDoorStatus] == 0)
+			_vm->_dialogs->show(10424);
+		else
+			_vm->_dialogs->show(10432);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR)) {
+		if (_globals[kTrapDoorStatus] == 1)
+			_vm->_dialogs->show(10425);
+		else
+			_vm->_dialogs->show(10433);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CHANDELIER)) {
+		_vm->_dialogs->show(10435);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene104::cleanInventory() {
+	if (_game._objects.isInInventory(OBJ_LARGE_NOTE))
+		_game._objects.setRoom(OBJ_LARGE_NOTE, NOWHERE);
+
+	if (_game._objects.isInInventory(OBJ_SANDBAG))
+		_game._objects.setRoom(OBJ_SANDBAG, NOWHERE);
+
+	if (_game._objects.isInInventory(OBJ_SMALL_NOTE))
+		_game._objects.setRoom(OBJ_SMALL_NOTE, NOWHERE);
+
+	if (_game._objects.isInInventory(OBJ_PARCHMENT))
+		_game._objects.setRoom(OBJ_PARCHMENT, NOWHERE);
+
+	if (_game._objects.isInInventory(OBJ_BOOK))
+		_game._objects.setRoom(OBJ_BOOK, NOWHERE);
+
+	if (_game._objects.isInInventory(OBJ_RED_FRAME))
+		_game._objects.setRoom(OBJ_RED_FRAME, 105);
+
+	if (_game._objects.isInInventory(OBJ_YELLOW_FRAME))
+		_game._objects.setRoom(OBJ_YELLOW_FRAME, 107);
+
+	if (_game._objects.isInInventory(OBJ_BLUE_FRAME))
+		_game._objects.setRoom(OBJ_BLUE_FRAME, 302);
+
+	if (_game._objects.isInInventory(OBJ_GREEN_FRAME))
+		_game._objects.setRoom(OBJ_GREEN_FRAME, 307);
+}
+
+void Scene104::processConversations() {
+	bool interlocutorTriggerFl = false;
+	bool heroTriggerFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 2:
+	case 10:
+	case 12:
+	case 16:
+	case 20:
+	case 21:
+	case 24:
+		_vm->_gameConv->setInterlocutorTrigger(75);
+		interlocutorTriggerFl = true;
+		break;
+
+	case 3:
+		if (!_needToGetUp) {
+			_vm->_gameConv->setInterlocutorTrigger(67);
+			interlocutorTriggerFl = true;
+			_needToGetUp = true;
+		}
+		break;
+
+	case 8:
+		_vm->_gameConv->setInterlocutorTrigger(87);
+		interlocutorTriggerFl = true;
+		break;
+
+	case 11:
+		_vm->_gameConv->setInterlocutorTrigger(77);
+		interlocutorTriggerFl = true;
+		break;
+
+	case 14:
+	case 25:
+		if (!_game._trigger) {
+			_richStatus = 0;
+			_coupleStatus = 5;
+			_vm->_gameConv->hold();
+		}
+		break;
+
+	case 22:
+		_vm->_gameConv->setInterlocutorTrigger(75);
+		_vm->_gameConv->setHeroTrigger(79);
+		interlocutorTriggerFl = true;
+		heroTriggerFl  = true;
+		break;
+
+	case 23:
+		_vm->_gameConv->setInterlocutorTrigger(89);
+		interlocutorTriggerFl = true;
+		break;
+
+	case 28:
+		_vm->_gameConv->setInterlocutorTrigger(81);
+		interlocutorTriggerFl = true;
+		break;
+
+	case 30:
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_richStatus = 4;
+		}
+		break;
+
+	case 32:
+		_coupleStatus = 14;
+		heroTriggerFl = true;
+		interlocutorTriggerFl = true;
+		_vm->_gameConv->hold();
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 67:
+		_vm->_gameConv->hold();
+		_coupleStatus = 12;
+		break;
+
+	case 69:
+		if (!_beforeSheLeaves && !_beforeHeLeaves && (_coupleStatus != 14) && !_needToStandUp) {
+			_richStatus = 0;
+			if (_sittingUp)
+				_coupleStatus = 4;
+			else
+				_coupleStatus = 12;
+		}
+		break;
+
+	case 71:
+		if (!_beforeSheLeaves && !_beforeHeLeaves && (_coupleStatus != 14) && !_needToStandUp) {
+			_richStatus = 0;
+			if (_sittingUp && !_beforeSheLeaves) {
+				_coupleStatus = 3;
+				_richStatus = 0;
+			}
+		}
+		break;
+
+	case 75:
+		_richStatus = 1;
+
+		if (_sittingUp) {
+			if (_action._activeAction._verbId == 20) {
+				_lookCount = 0;
+				_coupleStatus = 9;
+			} else if ((_action._activeAction._verbId == 21) || (_action._activeAction._verbId == 22)) {
+				_lookCount = 0;
+				_coupleStatus = 10;
+			} else {
+				_coupleStatus = 1;
+			}
+		} else {
+			_coupleStatus = 11;
+		}
+		break;
+
+	case 77:
+		_richStatus = 0;
+		_coupleStatus = 8;
+		break;
+
+	case 79:
+		_richStatus = 0;
+		_coupleStatus = 7;
+		break;
+
+	case 81:
+		_richStatus = 1;
+		_beforeHeLeaves = true;
+		_coupleStatus = 15;
+		break;
+
+	case 83:
+		_vm->_gameConv->release();
+		if (_coupleStatus != 17)
+			_game._player._stepEnabled = false;
+		break;
+
+	case 87:
+		_richStatus = 3;
+		break;
+
+	case 89:
+		_richStatus = 2;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroTriggerFl && !_beforeSheLeaves)
+		_vm->_gameConv->setHeroTrigger(71);
+
+	if (!interlocutorTriggerFl)
+		_vm->_gameConv->setInterlocutorTrigger(69);
+
+	_richTalkCount = 0;
+	_manTalkCount = 0;
+	_womanTalkCount = 0;
+}
+
+void Scene104::handleWalkAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _walkFrame)
+		return;
+
+	_walkFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
+	int daae_walk_reset_frame = -1;
+
+	switch (_walkFrame) {
+	case 1:
+		if (_walkStatus == 0) {
+			daae_walk_reset_frame = 0;
+		} else {
+			_game.syncTimers(3, _globals._animationIndexes[2], 3, _globals._animationIndexes[1]);
+			daae_walk_reset_frame = 1;
+		}
+		break;
+
+	case 138:
+		_walkStatus = 0;
+		daae_walk_reset_frame = 0;
+		break;
+
+	default:
+		break;
+	}
+
+	if (daae_walk_reset_frame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], daae_walk_reset_frame);
+		_walkFrame = daae_walk_reset_frame;
+	}
+}
+
+void Scene104::handleRichAnimations() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _richFrame)
+		return;
+
+	_richFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int random;
+	int resetFrame = -1;
+
+	switch (_richFrame) {
+	case 1:
+	case 2:
+	case 3:
+	case 4:
+	case 8:
+	case 14:
+	case 22:
+	case 34:
+	case 40:
+	case 44:
+	case 48:
+		random = -1;
+		if (_richStatus == 1) {
+			random = _vm->getRandomNumber(1, 3);
+			++_richTalkCount;
+			if (_richTalkCount > 15) {
+				_richStatus = 0;
+				random = 40;
+			}
+		}
+
+		if (_richStatus == 0)
+			random = _vm->getRandomNumber(7, 80);
+
+		if (_richStatus == 2) {
+			random = 4;
+			_richStatus = 1;
+			_richTalkCount = 8;
+		}
+
+		if (_richStatus == 3) {
+			random = 5;
+			_richStatus = 1;
+			_richTalkCount = 8;
+		}
+
+		if (_richStatus == 4)
+			random = 6;
+
+		if (_richStatus == 5)
+			random = 7;
+
+		switch (random) {
+		case 1:
+			resetFrame = 1;
+			break;
+
+		case 2:
+			resetFrame = 2;
+			break;
+
+		case 3:
+			resetFrame = 3;
+			break;
+
+		case 4:
+			resetFrame = 23;
+			break;
+
+		case 5:
+			resetFrame = 35;
+			break;
+
+		case 6:
+			resetFrame = 49;
+			break;
+
+		case 7:
+			resetFrame = 41;
+			break;
+
+		case 8:
+			resetFrame = 45;
+			break;
+
+		case 9:
+			resetFrame = 9;
+			break;
+
+		case 10:
+			resetFrame = 5;
+			break;
+
+		case 11:
+			resetFrame = 15;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+
+	case 117:
+		_coupleStatus = 13;
+		break;
+
+	case 125:
+		resetFrame = 124;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_richFrame = resetFrame;
+	}
+}
+
+void Scene104::handleCoupleAnimations() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _coupleFrame)
+		return;
+
+	_coupleFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random;
+
+	switch (_coupleFrame) {
+	case 1:
+	case 103:
+	case 104:
+	case 105:
+		if (_coupleStatus == 11)
+			resetFrame = 0;
+		else {
+			resetFrame = _vm->getRandomNumber(102, 104);
+			++_womanTalkCount;
+			if (_womanTalkCount > 15) {
+				if (_needToGetUp) {
+					_coupleStatus = 6;
+					resetFrame   = 1;
+				} else {
+					_coupleStatus = 11;
+					resetFrame   = 0;
+				}
+			}
+		}
+		break;
+
+	case 9:
+	case 10:
+	case 11:
+	case 12:
+	case 13:
+	case 14:
+	case 15:
+	case 25:
+	case 33:
+	case 41:
+		switch (_coupleFrame) {
+		case 9:
+			_coupleStatus = 6;
+			break;
+
+		case 33:
+			_vm->_gameConv->release();
+			if (_action._activeAction._verbId == 13)
+				_coupleStatus = 4;
+
+			break;
+
+		case 41:
+			_vm->_gameConv->release();
+			_sittingUp = true;
+			if (_needToTalk)
+				_coupleStatus = 3;
+			else
+				_coupleStatus = 1;
+			break;
+		}
+
+		random = -1;
+
+		switch (_coupleStatus) {
+		case 1:
+			random = 12;
+			break;
+
+		case 2:
+		case 7:
+		case 8:
+			random = 11;
+			break;
+
+		case 3:
+			random = _vm->getRandomNumber(4, 6);
+			++_manTalkCount;
+			if (_manTalkCount > 15) {
+				_coupleStatus = 1;
+				random = 12;
+			}
+			break;
+
+		case 4:
+			if (_beforeSheLeaves) {
+				random = 10;
+			} else {
+				random = _vm->getRandomNumber(1, 3);
+				++_womanTalkCount;
+				if (_womanTalkCount > 15) {
+					_coupleStatus = 1;
+					random = 12;
+				}
+			}
+			break;
+
+		case 5:
+			_coupleStatus = 1;
+			random = 8;
+			break;
+
+		case 6:
+			_coupleStatus = 1;
+			random = 7;
+			break;
+
+		case 13:
+			random = 9;
+			break;
+
+		case 15:
+			random = 10;
+			break;
+
+		default:
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 12;
+			break;
+
+		case 2:
+			resetFrame = 13;
+			break;
+
+		case 3:
+			resetFrame = 14;
+			break;
+
+		case 4:
+			resetFrame = 9;
+			break;
+
+		case 5:
+			resetFrame = 10;
+			break;
+
+		case 6:
+			resetFrame = 11;
+			break;
+
+		case 7:
+			resetFrame = 33;
+			break;
+
+		case 8:
+			resetFrame = 25;
+			break;
+
+		case 9:
+			resetFrame = 54;
+			break;
+
+		case 10:
+			resetFrame = 41;
+			break;
+
+		case 11:
+			resetFrame = 15;
+			break;
+
+		case 12:
+			resetFrame = 14;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 17:
+	case 18:
+	case 19:
+	case 20:
+	case 21:
+	case 22:
+	case 23:
+		random = -1;
+		switch (_coupleStatus) {
+		case 1:
+		case 3:
+		case 4:
+		case 5:
+		case 6:
+		case 15:
+		case 16:
+			random = 7;
+			break;
+
+		case 2:
+			random = 8;
+			break;
+
+		case 7:
+			random = _vm->getRandomNumber(4, 6);
+			++_manTalkCount;
+			if (_manTalkCount > 15) {
+				_coupleStatus = 2;
+				random = 8;
+			}
+			break;
+
+		case 8:
+			random = _vm->getRandomNumber(1, 3);
+			++_womanTalkCount;
+			if (_womanTalkCount > 15) {
+				_coupleStatus = 1;
+				random = 7;
+			}
+			break;
+
+		case 9:
+			random = 1;
+			++_lookCount;
+			if (_lookCount > 6) {
+				_coupleStatus = 1;
+				random = 7;
+			}
+			break;
+
+		case 10:
+			random = 1;
+			break;
+
+		default:
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 20;
+			break;
+
+		case 2:
+			resetFrame = 21;
+			break;
+
+		case 3:
+			resetFrame = 22;
+			break;
+
+		case 4:
+			resetFrame = 17;
+			break;
+
+		case 5:
+			resetFrame = 18;
+			break;
+
+		case 6:
+			resetFrame = 19;
+			break;
+
+		case 7:
+			resetFrame = 23;
+			break;
+
+		case 8:
+			resetFrame = 20;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 52:
+		_walkStatus = 1;
+		resetFrame = 54;
+		break;
+
+	case 55:
+		if (_coupleStatus != 13)
+			resetFrame = 54;
+
+		break;
+
+	case 89:
+		_vm->_gameConv->release();
+		break;
+
+	case 90:
+		if (_coupleStatus != 14) {
+			resetFrame = 89;
+		} else {
+			resetFrame = 90;
+			_globals[kTempVar] = 200;
+		}
+		break;
+
+	case 102:
+		_vm->_gameConv->release();
+		_game._player._playerPos = Common::Point(166, 126);
+		_game._player.resetFacing(FACING_SOUTH);
+		resetFrame = 105;
+		_game._player._visible = true;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		break;
+
+	case 106:
+		_coupleStatus = 17;
+		resetFrame = 105;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_coupleFrame = resetFrame;
+	}
+}
+
+void Scene104::handlePlayerWalk() {
+	if (_game._player._frameNumber == _lastPlayerFrame)
+		return;
+
+	_lastPlayerFrame = _game._player._frameNumber;
+	switch (_game._player._facing) {
+	case FACING_NORTH:
+	case FACING_SOUTH:
+		if ((_game._player._frameNumber == 5) || (_game._player._frameNumber == 11))
+			_vm->_sound->command(68);
+		break;
+
+	case FACING_NORTHEAST:
+	case FACING_NORTHWEST:
+	case FACING_SOUTHEAST:
+	case FACING_SOUTHWEST:
+		if ((_game._player._frameNumber == 7) || (_game._player._frameNumber == 14))
+			_vm->_sound->command(68);
+		break;
+
+	case FACING_EAST:
+	case FACING_WEST:
+		if ((_game._player._frameNumber == 8) || (_game._player._frameNumber == 16))
+			_vm->_sound->command(68);
+		break;
+
+	default:
+		break;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 173f6c5..cd9f6ae 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -150,6 +150,48 @@ public:
 	virtual void actions();
 };
 
+class Scene104 : public Scene1xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _needToGetUp;
+	bool _needToStandUp;
+	bool _needToTalk;
+	bool _sittingUp;
+	bool _beforeSheLeaves;
+	bool _beforeHeLeaves;
+
+	int _walkStatus;
+	int _walkFrame;
+	int _coupleStatus;
+	int _coupleFrame;
+	int _richStatus;
+	int _richFrame;
+	int _manTalkCount;
+	int _womanTalkCount;
+	int _lookCount;
+	int _richTalkCount;
+	int _lastPlayerFrame;
+
+	void cleanInventory();
+	void processConversations();
+	void handleWalkAnimation();
+	void handleCoupleAnimations();
+	void handleRichAnimations();
+	void handlePlayerWalk();
+
+public:
+	Scene104(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 530c3303c6457054daf8211886ae824937670af6
    https://github.com/scummvm/scummvm/commit/530c3303c6457054daf8211886ae824937670af6
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-16T15:55:08+02:00

Commit Message:
MADS: Phantom: Fix some code formatting

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 7d6ba22..66a8721 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -947,7 +947,7 @@ void Scene103::enter() {
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 
 			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1) ;
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1);
 		}
 
 		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(121, 79, 40, 63));
@@ -1464,7 +1464,7 @@ void Scene103::actions() {
 				case 75:
 					if (_globals[kPrompterStandStatus] == 0) {
 						_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
-						_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1) ;
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1);
 						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
 						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));


Commit: abd7d58633bb0a0e024ddfd5f257b09e532d4630
    https://github.com/scummvm/scummvm/commit/abd7d58633bb0a0e024ddfd5f257b09e532d4630
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-18T01:07:06+02:00

Commit Message:
MADS: Phantom: Add logic for scene 105

Use an enum in various calls of _scene->_dynamicHotspots.add()

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/scene.cpp
    engines/mads/scene.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 83b7f8b..4e474a8 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -49,9 +49,9 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 103:	// below stage
 		return new Scene103(vm);
 	case 104:	// stage
-		return new DummyScene(vm);	// TODO
+		return new Scene104(vm);
 	case 105:	// ground floor, storage room
-		return new DummyScene(vm);	// TODO
+		return new Scene105(vm);
 	case 106:	// behind stage
 		return new DummyScene(vm);	// TODO
 	case 107:	// stage right wing
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 66a8721..78fe216 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -191,7 +191,7 @@ void Scene101::enter() {
 		_anim0Running  = true;
 		_anim1Running  = true;
 
-		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_brieAnimId, Common::Point(490, 119), FACING_NONE);
 		_scene->setDynamicAnim(_brieAnimId, 0, 0);
@@ -200,7 +200,7 @@ void Scene101::enter() {
 		_scene->setDynamicAnim(_brieAnimId, 0, 3);
 		_scene->setDynamicAnim(_brieAnimId, 0, 4);
 
-		int tmpIdx = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		int tmpIdx = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(25, 80), FACING_NONE);
 		_scene->setDynamicAnim(tmpIdx, 1, 1);
@@ -209,7 +209,7 @@ void Scene101::enter() {
 		_talkCounter = 0;
 	} else if (_globals[kBrieTalkStatus] == 1) {
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1);
-		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(0, 0, 0, 0));
+		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
 		_scene->setDynamicAnim(_brieAnimId, 1, 1);
 		_scene->setDynamicAnim(_brieAnimId, 1, 2);
@@ -950,38 +950,38 @@ void Scene103::enter() {
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1);
 		}
 
-		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(121, 79, 40, 63));
+		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 79, 40, 63));
 		_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, promptPos, promptFacing);
 
-		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(161, 67, 16, 75));
+		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(161, 67, 16, 75));
 		_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, promptPos, promptFacing);
 
-		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(177, 90, 18, 52));
+		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(177, 90, 18, 52));
 		_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, promptPos, promptFacing);
 
-		_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(114, 100, 7, 38));
+		_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 100, 7, 38));
 		_scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt4, promptPos, promptFacing);
 
-		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, -1, Common::Rect(121, 49, 40, 30));
+		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 40, 30));
 		_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST);
 		_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
 
-		_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(154, 6, 41, 6));
+		_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(154, 6, 41, 6));
 		_scene->_dynamicHotspots[_hotspotRightFloor1]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotRightFloor1, Common::Point(171, 142), FACING_NONE);
 
-		_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(114, 136, 32, 6));
+		_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 136, 32, 6));
 		_scene->_dynamicHotspots[_hotspotRightFloor2]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotRightFloor2, Common::Point(127, 140), FACING_NONE);
 
 		if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881)) {
 			if (_globals[kJacquesNameIsKnown] >= 1) {
-				_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(156, 116, 33, 31));
+				_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(156, 116, 33, 31));
 				_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
 				_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
 			} else {
@@ -989,11 +989,11 @@ void Scene103::enter() {
 				_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
 				_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
 			}
-			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(149, 140, 13, 7));
+			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(149, 140, 13, 7));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(155, 144), FACING_NONE);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(187, 136, 8, 7));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(187, 136, 8, 7));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(195, 139), FACING_NONE);
 		} else if ((_globals[kJacquesStatus] >= 1) && (_globals[kCurrentYear] == 1881)) {
@@ -1007,23 +1007,23 @@ void Scene103::enter() {
 			_scene->_hotspots.activate(NOUN_JACQUES, true);
 			_scene->_dynamicHotspots.remove(_hotspotRightFloor2);
 
-			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(114, 132, 30, 10));
+			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(114, 132, 30, 10));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(95, 144), FACING_NORTHEAST);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(94, 129, 18, 4));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(94, 129, 18, 4));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(95, 133), FACING_NONE);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(94, 132, 3, 9));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(94, 132, 3, 9));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(93, 135), FACING_NONE);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(112, 150, 21, 3));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(112, 150, 21, 3));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(118, 154), FACING_NONE);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(98, 146, 21, 4));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(98, 146, 21, 4));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(104, 148), FACING_NONE);
 		}
@@ -1032,27 +1032,27 @@ void Scene103::enter() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
 
-		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(2, 79, 40, 63));
+		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 79, 40, 63));
 		_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST);
 
-		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(42, 67, 16, 75));
+		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(42, 67, 16, 75));
 		_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(59, 140), FACING_NORTHWEST);
 
-		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(58, 90, 18, 52));
+		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(58, 90, 18, 52));
 		_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST);
 
-		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, -1, Common::Rect(2, 49, 40, 30));
+		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 40, 30));
 		_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST);
 		_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
 
-		_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(35, 137, 40, 5));
+		_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 137, 40, 5));
 		_scene->_dynamicHotspots[_hotspotLeftFloor1]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor1, Common::Point(59, 140), FACING_NONE);
-		_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(76, 129, 6, 6));
+		_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(76, 129, 6, 6));
 		_scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE);
 	}
@@ -1483,32 +1483,32 @@ void Scene103::actions() {
 						_scene->_dynamicHotspots.remove(_hotspotLeftFloor1);
 						_scene->_dynamicHotspots.remove(_hotspotLeftFloor2);
 
-						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(121, 79, 40, 63));
+						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 79, 40, 63));
 						_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(161, 67, 16, 75));
+						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(161, 67, 16, 75));
 						_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(177, 90, 18, 52));
+						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(177, 90, 18, 52));
 						_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(114, 100, 7, 38));
+						_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 100, 7, 38));
 						_scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt4, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, -1, Common::Rect(121, 49, 40, 30));
+						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 40, 30));
 						_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST);
 						_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
 
-						_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(154, 6, 41, 6));
+						_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(154, 6, 41, 6));
 						_scene->_dynamicHotspots[_hotspotRightFloor1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotRightFloor1, Common::Point(171, 142), FACING_NONE);
 
-						_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(114, 136, 32, 6));
+						_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 136, 32, 6));
 						_scene->_dynamicHotspots[_hotspotRightFloor2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotRightFloor2, Common::Point(127, 140), FACING_NONE);
 
@@ -1554,27 +1554,27 @@ void Scene103::actions() {
 						_scene->_dynamicHotspots.remove(_hotspotRightFloor1);
 						_scene->_dynamicHotspots.remove(_hotspotRightFloor2);
 
-						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(2, 79, 40, 63));
+						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 79, 40, 63));
 						_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST);
 
-						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(42, 67, 16, 75));
+						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(42, 67, 16, 75));
 						_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(59, 140), FACING_NORTHWEST);
 
-						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, -1, Common::Rect(58, 90, 18, 52));
+						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(58, 90, 18, 52));
 						_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST);
 
-						_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(35, 137, 40, 5));
+						_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 137, 40, 5));
 						_scene->_dynamicHotspots[_hotspotLeftFloor1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor1, Common::Point(59, 140), FACING_NONE);
 
-						_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, -1, Common::Rect(76, 129, 6, 6));
+						_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(76, 129, 6, 6));
 						_scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE);
 
-						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, -1, Common::Rect(2, 49, 40, 30));
+						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 40, 30));
 						_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST);
 						_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
@@ -2360,7 +2360,7 @@ void Scene103::process_conv_jacques() {
 		if (_globals[kJacquesNameIsKnown] == 0) {
 			_globals[kJacquesNameIsKnown] = 1;
 			_scene->_dynamicHotspots.remove(_hotspotGentleman);
-			_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, -1, Common::Rect(156, 116, 33, 31));
+			_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(156, 116, 33, 31));
 			_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
 		}
@@ -3626,5 +3626,572 @@ void Scene104::handlePlayerWalk() {
 
 /*------------------------------------------------------------------------*/
 
+Scene105::Scene105(MADSEngine *vm) : Scene1xx(vm) {
+}
+
+void Scene105::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+}
+
+void Scene105::setup() {
+	if (_globals[kCurrentYear] == 1993)
+		_scene->_initialVariant = 1;
+
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_LIGHT_FIXTURE);
+}
+
+void Scene105::enter() {
+	_scene->loadSpeech(8);
+
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+	if (_globals[kCurrentYear] == 1993)
+		_globals._spriteIndexes[3]       = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+
+	if ((_globals[kCurrentYear] == 1881) && (!_globals[kHintThatDaaeIsHome2])) {
+		if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2) &&
+			_globals[kPanelIn206] && _globals[kDoneRichConv203] && _game._objects.isInInventory(OBJ_LANTERN) &&
+			((_game._objects.isInInventory(OBJ_CABLE_HOOK) && _game._objects.isInInventory(OBJ_ROPE)) || _game._objects.isInInventory(OBJ_ROPE_WITH_HOOK))) {
+			_globals[kHintThatDaaeIsHome2] = true;
+			_scene->_sequences.setTimingTrigger(300, 75);
+		}
+	}
+
+	if ((_game._objects.isInRoom(OBJ_LANTERN)) && (_globals[kCurrentYear] == 1881)) {
+		_globals._spriteIndexes[0]  = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	} else {
+		_scene->_hotspots.activate(NOUN_LANTERN, false);
+	}
+
+	if (_game._objects.isInRoom(OBJ_RED_FRAME)) {
+		_globals._spriteIndexes[1]  = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+	} else {
+		_scene->_hotspots.activate(NOUN_RED_FRAME, false);
+	}
+
+	if (_globals[kCurrentYear] == 1993) {
+		_scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_PROPS, false);
+		_scene->_hotspots.activate(NOUN_BEAR_PROP, false);
+		_scene->_hotspots.activate(NOUN_STAIR_UNIT, false);
+		_scene->_hotspots.activate(NOUN_PROP, false);
+		_scene->_hotspots.activate(NOUN_ELEPHANT_PROP, false);
+		_scene->_hotspots.activate(NOUN_COLUMN_PROP, false);
+
+		int tmpIdx = _scene->_dynamicHotspots.add(NOUN_COLUMN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(132, 24, 21, 105));
+		_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(159, 133), FACING_NORTHWEST);
+
+		tmpIdx = _scene->_dynamicHotspots.add(NOUN_COLUMN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(56, 45, 11, 77));
+		_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(72, 126), FACING_NORTHWEST);
+
+		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(0, 125, 29, 31));
+		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(29, 136, 50, 20));
+		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(79, 141, 53, 15));
+
+		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(278, 132, 21, 24));
+		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(299, 146, 8, 10));
+		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(269, 142, 8, 8));
+
+		_scene->_dynamicHotspots.add(NOUN_LIGHT_FIXTURE, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(102, 14, 24, 10));
+	}
+
+	_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 2);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+	if ((_scene->_priorSceneId == 106) || (_scene->_priorSceneId == 114)) {
+		_game._player._playerPos = Common::Point(198, 132);
+		_game._player._facing = FACING_WEST;
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+	} else if ((_scene->_priorSceneId == 103) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(3, 112);
+		_game._player._facing = FACING_SOUTHEAST;
+		_game._player.walk(Common::Point(45, 131), FACING_SOUTHEAST);
+		_game._player.setWalkTrigger(60);
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 8);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+	} else if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene105::step() {
+	switch (_game._trigger) {
+	case 60:
+		_scene->deleteSequence(_globals._sequenceIndexes[2]);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 0, 0, 1);   
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+		_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 8);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 61);
+		_vm->_sound->command(66);
+		break; 
+
+	case 61:
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+		_game._player._stepEnabled = true;
+		break;
+
+	case 75:
+		_scene->playSpeech(8);
+		_scene->_sequences.setTimingTrigger(120, 76);
+		break;
+
+	case 76:
+		_vm->_dialogs->show(10537);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene105::actions() {
+	if ((_action.isAction(VERB_PUSH, NOUN_THUNDER_MACHINE)) || (_action.isAction(VERB_PULL, NOUN_THUNDER_MACHINE))) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 70);
+			_scene->deleteSequence(_globals._sequenceIndexes[4]);
+			_game.syncTimers(1, _globals._sequenceIndexes[4], 3, _globals._animationIndexes[0]);
+			_scene->_sequences.setSeqPlayer(_globals._animationIndexes[0], false);
+			break;
+
+		case 70:
+			_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+			_game.syncTimers(1, _globals._sequenceIndexes[4], 3, _globals._animationIndexes[0]);
+			_game._player._stepEnabled = true;
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_UP, NOUN_CIRCULAR_STAIRCASE)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1);
+			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			break;
+
+		case 1:
+			_scene->_nextSceneId = 106;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_DOWN, NOUN_CIRCULAR_STAIRCASE)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1);
+			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			break;
+
+		case 1:
+			_scene->_nextSceneId = 114;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME) && (_game._objects.isInRoom(OBJ_RED_FRAME) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			if (_globals[kCurrentYear] == 1881) {
+				int count = 0;
+
+				if (_game._objects.isInInventory(NOUN_YELLOW_FRAME))
+					++count;
+
+				if (_game._objects.isInInventory(NOUN_GREEN_FRAME))
+					++count;
+
+				if (_game._objects.isInInventory(NOUN_BLUE_FRAME))
+					++count;
+
+				if (count < 3)
+					_globals[kPlayerScore] += 5;
+			}
+
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;  
+			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 0, 0, 2);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[5], 1, 5);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 5, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 2);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[1]);
+			_scene->_hotspots.activate(NOUN_RED_FRAME, false);
+			_game._objects.addToInventory(OBJ_RED_FRAME);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]); 
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->showItem(OBJ_RED_FRAME, 842, 0);
+			else
+				_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+
+			_game._player._stepEnabled = true;
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_LANTERN) && (_game._objects.isInRoom(OBJ_LANTERN) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			_globals[kPlayerScore] += 5;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;  
+			_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 0, 0, 2);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 2, 4, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[0]);
+			_scene->_hotspots.activate(NOUN_LANTERN, false);
+			_game._objects.addToInventory(OBJ_LANTERN);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]); 
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			_vm->_dialogs->showItem(OBJ_LANTERN, 801, 0);
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || (_game._trigger) ||
+		_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR)) {
+		if ((_globals[kCurrentYear] == 1881) && !_action.isAction(VERB_UNLOCK) && !_action.isAction(NOUN_LOCK)){
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;  
+				_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 0, 0, 2);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 2, 4, 65);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
+				break;
+
+			case 2:
+				_game._player._visible = true;
+				_scene->_sequences.setTimingTrigger(180, 3);
+				break;
+
+			case 3:
+				_scene->_nextSceneId = 103;
+				break;
+
+			case 65:
+				_vm->_sound->command(24);
+				_scene->deleteSequence(_globals._sequenceIndexes[2]);
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 0, 0, 1);   
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 8);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
+				_vm->_sound->command(66);
+				break; 
+
+			case 66: {
+				int tmpIdx = _globals._sequenceIndexes[2];
+				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 8);
+				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, tmpIdx); 
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+				_game._player.walk(Common::Point(0, 111), FACING_NORTHWEST);
+				}
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;  
+				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], true, 5, 0, 0, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 1);
+				break;
+
+			case 1: {
+				int tmpIdx = _globals._sequenceIndexes[6];
+				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], true, 4);
+				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx); 
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false);
+				_vm->_sound->command(73);
+				_scene->_sequences.setTimingTrigger(15, 2);
+				}
+				break; 
+
+			case 2:
+				_scene->deleteSequence(_globals._sequenceIndexes[6]);
+				_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], true, 5, 0, 0, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 3);
+				break;
+
+			case 3:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]); 
+				_game._player._visible = true;
+				if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
+					_vm->_dialogs->show(32);
+				else
+					_vm->_dialogs->show(10536);
+
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(10510);
+		else
+			_vm->_dialogs->show(10511);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_FLOOR)) {
+			_vm->_dialogs->show(10512);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CIRCULAR_STAIRCASE)) {
+			_vm->_dialogs->show(10513);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LANTERN) && _game._objects.isInRoom(OBJ_LANTERN))  {
+			_vm->_dialogs->show(10514);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_RED_FRAME) && _game._objects.isInRoom(OBJ_RED_FRAME)){
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->show(10530);
+			else
+				_vm->_dialogs->show(10515);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DOOR)) {
+			_vm->_dialogs->show(10516);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(10517);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROP_TABLE)) {
+			_vm->_dialogs->show(10518);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BEAR_PROP)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(10519);
+			else
+				_vm->_dialogs->show(10538);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_ELEPHANT_PROP)) {
+			_vm->_dialogs->show(10520);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_COLUMN_PROP)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(10521);
+			else
+				_vm->_dialogs->show(10539);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_THUNDER_MACHINE)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(10522);
+			else
+				_vm->_dialogs->show(10540);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAIR_UNIT)) {
+			_vm->_dialogs->show(10523);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROP)) {
+			_vm->_dialogs->show(10524);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROPS)) {
+			_vm->_dialogs->show(10525);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_EXIT_SIGN)) {
+			_vm->_dialogs->show(10526);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_FLATS)) {
+			_vm->_dialogs->show(10527);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_HEMP)) {
+			_vm->_dialogs->show(10528);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PIPE)) {
+			_vm->_dialogs->show(10529);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_GRAFFITI)) {
+			_vm->_dialogs->show(10531);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+			_vm->_dialogs->show(10535);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_BEAR_PROP)) {
+		_vm->_dialogs->show(10532);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BEAR_PROP)) {
+		_vm->_dialogs->show(10533);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) {
+		_vm->_dialogs->show(10534);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene105::preActions() {
+  if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_PIT))
+    _game._player._walkOffScreenSceneId = 102;
+
+  if (_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR))
+	  _game._player.walk(Common::Point(33, 128), FACING_NORTHWEST);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index cd9f6ae..83b94ba 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -192,6 +192,20 @@ public:
 	virtual void actions();
 };
 
+class Scene105 : public Scene1xx {
+private:
+
+public:
+	Scene105(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 57c93a9..5a8fbe6 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -782,4 +782,12 @@ void Scene::drawToBackground(int series_id, int sprite_id, Common::Point pos, in
 void Scene::deleteSequence(int idx) {
 	warning("TODO: Scene::deleteSequence");
 }
+
+void Scene::loadSpeech(int idx) {
+	warning("TODO: Scene::loadSpeech");
+}
+
+void Scene::playSpeech(int idx) {
+	warning("TODO: Scene::playSpeech");
+}
 } // End of namespace MADS
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index 57cc794..653bdd1 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -262,6 +262,8 @@ public:
 	void setCamera(Common::Point pos);
 	void drawToBackground(int series_id, int sprite_id, Common::Point pos, int depth, int scale);
 	void deleteSequence(int idx);
+	void loadSpeech(int idx);
+	void playSpeech(int idx);
 };
 
 } // End of namespace MADS


Commit: f6db784f5065d9888ef5f99b4495ef0cc8eaa4a4
    https://github.com/scummvm/scummvm/commit/f6db784f5065d9888ef5f99b4495ef0cc8eaa4a4
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-18T01:14:12+02:00

Commit Message:
MADS: Phantom: Fix several calls to startPingPongCycle, addSpriteCycle and addReverseSpriteCycle

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 78fe216..edf7d45 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -1604,7 +1604,7 @@ void Scene103::actions() {
 			case (0):
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
-				_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 0, 0, 2);
+				_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 2);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[2], -1, -2);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
@@ -1696,7 +1696,7 @@ void Scene103::actions() {
 		case (0):
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
-			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 0, 0, 2);
+			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 2);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[8], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
@@ -2716,7 +2716,7 @@ void Scene104::actions() {
 			switch (_game._trigger) {
 			case 0:
 				_game._player._visible = false;
-				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 1);
+				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 16);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
@@ -2758,7 +2758,7 @@ void Scene104::actions() {
 			_vm->_dialogs->show(10426);
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
-			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0, 0, 1);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[3], -1, 4);
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
@@ -2767,7 +2767,7 @@ void Scene104::actions() {
 			break;
 
 		case 1:
-			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 1, 0, 0, 10);
+			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 1, 10);
 			_scene->_sequences.setTimingTrigger(60, 2);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[3], 4, 4);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
@@ -3735,7 +3735,7 @@ void Scene105::step() {
 	switch (_game._trigger) {
 	case 60:
 		_scene->deleteSequence(_globals._sequenceIndexes[2]);
-		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 0, 0, 1);   
+		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);   
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
 		_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 8);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 61);
@@ -3852,7 +3852,7 @@ void Scene105::actions() {
 
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;  
-			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 0, 0, 2);
+			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[5], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 5, 1);
@@ -3891,7 +3891,7 @@ void Scene105::actions() {
 			_globals[kPlayerScore] += 5;
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;  
-			_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 0, 0, 2);
+			_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 2, 4, 1);
@@ -3930,7 +3930,7 @@ void Scene105::actions() {
 			case (0):
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;  
-				_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 0, 0, 2);
+				_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 2, 4, 65);
@@ -3949,7 +3949,7 @@ void Scene105::actions() {
 			case 65:
 				_vm->_sound->command(24);
 				_scene->deleteSequence(_globals._sequenceIndexes[2]);
-				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 0, 0, 1);   
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);   
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 8);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
@@ -3973,7 +3973,7 @@ void Scene105::actions() {
 			case (0):
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;  
-				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], true, 5, 0, 0, 1);
+				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], true, 5, 1);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 1);
@@ -3991,7 +3991,7 @@ void Scene105::actions() {
 
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[6]);
-				_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], true, 5, 0, 0, 1);
+				_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], true, 5, 1);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 3);


Commit: 9519fb3a86d129c0761bb17f82994176f2c4382f
    https://github.com/scummvm/scummvm/commit/9519fb3a86d129c0761bb17f82994176f2c4382f
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-18T10:18:39+02:00

Commit Message:
MADS: Phantom: Fix hotspot rects, remove some dead code

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index edf7d45..523a33f 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -950,46 +950,46 @@ void Scene103::enter() {
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1);
 		}
 
-		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 79, 40, 63));
+		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 79, 121 + 40, 79 + 63));
 		_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, promptPos, promptFacing);
 
-		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(161, 67, 16, 75));
+		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(161, 67, 161 + 16, 67 + 75));
 		_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, promptPos, promptFacing);
 
-		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(177, 90, 18, 52));
+		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(177, 90, 177 + 18, 90 + 52));
 		_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, promptPos, promptFacing);
 
-		_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 100, 7, 38));
+		_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 100, 114 + 7, 100 + 38));
 		_scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt4, promptPos, promptFacing);
 
-		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 40, 30));
+		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 121 + 40, 49 + 30));
 		_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST);
 		_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
 
-		_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(154, 6, 41, 6));
+		_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(154, 6, 154 + 41, 6 + 6));
 		_scene->_dynamicHotspots[_hotspotRightFloor1]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotRightFloor1, Common::Point(171, 142), FACING_NONE);
 
-		_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 136, 32, 6));
+		_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 136, 114 + 32, 136 + 6));
 		_scene->_dynamicHotspots[_hotspotRightFloor2]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotRightFloor2, Common::Point(127, 140), FACING_NONE);
 
 		if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881)) {
 			if (_globals[kJacquesNameIsKnown] >= 1) {
-				_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(156, 116, 33, 31));
+				_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(156, 116, 156 + 33, 116 + 31));
 				_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
 				_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
 			} else {
-				_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_GENTLEMAN, VERB_WALKTO, SYNTAX_MASC_NOT_PROPER, -1, Common::Rect(156, 116, 33, 31));
+				_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_GENTLEMAN, VERB_WALKTO, SYNTAX_MASC_NOT_PROPER, -1, Common::Rect(156, 116, 156 + 33, 116 + 31));
 				_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
 				_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
 			}
-			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(149, 140, 13, 7));
+			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(149, 140, 149 + 13, 140 + 7));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(155, 144), FACING_NONE);
 
@@ -1007,23 +1007,23 @@ void Scene103::enter() {
 			_scene->_hotspots.activate(NOUN_JACQUES, true);
 			_scene->_dynamicHotspots.remove(_hotspotRightFloor2);
 
-			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(114, 132, 30, 10));
+			int tmpIdx = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(114, 132, 114 + 30, 132 + 10));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(95, 144), FACING_NORTHEAST);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(94, 129, 18, 4));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(94, 129, 94 + 18, 129 + 4));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(95, 133), FACING_NONE);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(94, 132, 3, 9));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(94, 132, 94 + 3, 132 + 9));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(93, 135), FACING_NONE);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(112, 150, 21, 3));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(112, 150, 112 + 21, 150 + 3));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(118, 154), FACING_NONE);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(98, 146, 21, 4));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(98, 146, 98 + 21, 146 + 4));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(104, 148), FACING_NONE);
 		}
@@ -1032,27 +1032,27 @@ void Scene103::enter() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
 
-		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 79, 40, 63));
+		_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 79, 2 + 40, 79 + 63));
 		_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST);
 
-		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(42, 67, 16, 75));
+		_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(42, 67, 42 + 16, 67 + 75));
 		_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(59, 140), FACING_NORTHWEST);
 
-		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(58, 90, 18, 52));
+		_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(58, 90, 58 + 18, 90 + 52));
 		_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST);
 
-		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 40, 30));
+		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 2 + 40, 49 + 30));
 		_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST);
 		_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
 
-		_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 137, 40, 5));
+		_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 137, 35 + 40, 137 + 5));
 		_scene->_dynamicHotspots[_hotspotLeftFloor1]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor1, Common::Point(59, 140), FACING_NONE);
-		_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(76, 129, 6, 6));
+		_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(76, 129, 76 + 6, 129 + 6));
 		_scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE);
 	}
@@ -1089,12 +1089,10 @@ void Scene103::enter() {
 
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
-
 	} else if (_scene->_priorSceneId == 102) {
 		_game._player.firstWalk(Common::Point(-20, 140), FACING_EAST, Common::Point(15, 147), FACING_EAST, true);
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
-
 	} else if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
 		_game._player._playerPos = Common::Point(287, 135);
 		_game._player._facing = FACING_WEST;
@@ -1103,16 +1101,13 @@ void Scene103::enter() {
 		_game._player.setWalkTrigger(65);
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 6);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
-
 	} else if (_scene->_priorSceneId == -1) {
 		if (_standPosition == 1) {
 			_game._player._visible = false;
 			_globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0);
 			_anim5ActvFl = true;
 			_scene->setAnimFrame(_globals._animationIndexes[5], 33);
-
 		} else if (_standPosition == 2) {
-
 			_scene->deleteSequence(_globals._sequenceIndexes[3]);
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
@@ -1122,7 +1117,6 @@ void Scene103::enter() {
 			_anim3ActvFl = true;
 			_game._player._stepEnabled = true;
 			_scene->setAnimFrame(_globals._animationIndexes[3], 36);
-
 		} else if (_vm->_gameConv->_restoreRunning == 12) {
 			_vm->_gameConv->run(12);
 			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
@@ -1439,11 +1433,9 @@ void Scene103::actions() {
 		}
 	}
 
-	if (_action.isAction(NOUN_CLIMB, NOUN_PROMPTERS_STAND)) {
-		if (_standPosition != 0) {
-			_action._inProgress = false;
-			return;
-		}
+	if (_action.isAction(NOUN_CLIMB, NOUN_PROMPTERS_STAND) && (_standPosition != 0)) {
+		_action._inProgress = false;
+		return;
 	}
 
 	if ((_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) || (_action.isAction(VERB_PULL, NOUN_PROMPTERS_STAND))) {
@@ -1483,32 +1475,32 @@ void Scene103::actions() {
 						_scene->_dynamicHotspots.remove(_hotspotLeftFloor1);
 						_scene->_dynamicHotspots.remove(_hotspotLeftFloor2);
 
-						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 79, 40, 63));
+						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 79, 121 + 40, 79 + 63));
 						_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(161, 67, 16, 75));
+						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(161, 67, 161 + 16, 67 + 75));
 						_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(177, 90, 18, 52));
+						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(177, 90, 177 + 18, 90 + 52));
 						_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 100, 7, 38));
+						_hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 100, 114 + 7, 100 + 38));
 						_scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt4, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 40, 30));
+						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 121 + 40, 49 + 30));
 						_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST);
 						_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
 
-						_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(154, 6, 41, 6));
+						_hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(154, 6, 154 + 41, 6 + 6));
 						_scene->_dynamicHotspots[_hotspotRightFloor1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotRightFloor1, Common::Point(171, 142), FACING_NONE);
 
-						_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 136, 32, 6));
+						_hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 136, 114 + 32, 132 + 6));
 						_scene->_dynamicHotspots[_hotspotRightFloor2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotRightFloor2, Common::Point(127, 140), FACING_NONE);
 
@@ -1554,7 +1546,7 @@ void Scene103::actions() {
 						_scene->_dynamicHotspots.remove(_hotspotRightFloor1);
 						_scene->_dynamicHotspots.remove(_hotspotRightFloor2);
 
-						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 79, 40, 63));
+						_hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 79, 2 + 40, 79 + 63));
 						_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST);
 
@@ -1588,12 +1580,11 @@ void Scene103::actions() {
 					break;
 				}
 			}
-		} else {
-			if (_globals[kJacquesNameIsKnown])
-				_vm->_dialogs->show(10340);
-			else
-				_vm->_dialogs->show(10350);
-		}
+		} else if (_globals[kJacquesNameIsKnown])
+			_vm->_dialogs->show(10340);
+		else
+			_vm->_dialogs->show(10350);
+
 		_action._inProgress = false;
 		return;
 	}
@@ -1963,12 +1954,10 @@ void Scene103::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_KEY)) {
-			if (_game._objects.isInRoom(OBJ_KEY)) {
-				_vm->_dialogs->show(10326);
-				_action._inProgress = false;
-				return;
-			}
+		if (_action.isAction(NOUN_KEY) && _game._objects.isInRoom(OBJ_KEY)) {
+			_vm->_dialogs->show(10326);
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isAction(NOUN_STAIR_UNIT)) {
@@ -2217,9 +2206,9 @@ void Scene103::handleJacquesAnim() {
 
 	case 44:
 		random = _vm->getRandomNumber(1, 50);
-		while (_lastRandom == random) {
+		while (_lastRandom == random)
 			random = _vm->getRandomNumber(1, 50);
-		}
+
 		_lastRandom = random;
 
 		switch (_jacquesAction) {
@@ -2312,8 +2301,6 @@ void Scene103::descendRightStairs() {
 	if (_scene->getAnimFrame(_globals._animationIndexes[4]) == _lastStairFrame)
 		return;
 
-	// CHECKME: use of this local variable
-	int stairs_reset_frame = -1;
 	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[4]);
 
 	if (_lastStairFrame == 2) {
@@ -2322,19 +2309,12 @@ void Scene103::descendRightStairs() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 	}
-
-	if (stairs_reset_frame >= 0) {
-		_scene->setAnimFrame(_globals._animationIndexes[4], stairs_reset_frame);
-		_lastStairFrame = stairs_reset_frame;
-	}
 }
 
 void Scene103::descendLeftStairs() {
 	if (_scene->getAnimFrame(_globals._animationIndexes[6]) == _lastStairFrame)
 		return;
 
-	// CHECKME: use of this local variable
-	int stairs_reset_frame = -1;
 	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[6]);
 
 	if (_lastStairFrame == 2) {
@@ -2343,11 +2323,6 @@ void Scene103::descendLeftStairs() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
 	}
-
-	if (stairs_reset_frame >= 0) {
-		_scene->setAnimFrame(_globals._animationIndexes[6], stairs_reset_frame);
-		_lastStairFrame = stairs_reset_frame;
-	}
 }
 
 void Scene103::process_conv_jacques() {
@@ -2396,7 +2371,8 @@ void Scene103::process_conv_jacques() {
 		break;
 	}
 
-	if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 8) && (_action._activeAction._verbId != 12) && (_action._activeAction._verbId != 29))
+	if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 8)
+	 && (_action._activeAction._verbId != 12) && (_action._activeAction._verbId != 29))
 		_vm->_gameConv->setInterlocutorTrigger(90);
 
 	_vm->_gameConv->setHeroTrigger(92);
@@ -3690,21 +3666,21 @@ void Scene105::enter() {
 		_scene->_hotspots.activate(NOUN_ELEPHANT_PROP, false);
 		_scene->_hotspots.activate(NOUN_COLUMN_PROP, false);
 
-		int tmpIdx = _scene->_dynamicHotspots.add(NOUN_COLUMN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(132, 24, 21, 105));
+		int tmpIdx = _scene->_dynamicHotspots.add(NOUN_COLUMN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(132, 24, 132 + 21, 24 + 105));
 		_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(159, 133), FACING_NORTHWEST);
 
-		tmpIdx = _scene->_dynamicHotspots.add(NOUN_COLUMN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(56, 45, 11, 77));
+		tmpIdx = _scene->_dynamicHotspots.add(NOUN_COLUMN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(56, 45, 56 + 11, 45 + 77));
 		_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(72, 126), FACING_NORTHWEST);
 
-		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(0, 125, 29, 31));
-		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(29, 136, 50, 20));
-		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(79, 141, 53, 15));
+		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(0, 125, 29, 125 + 31));
+		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(29, 136, 29 + 50, 136 + 20));
+		_scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(79, 141, 79 + 53, 141 + 15));
 
-		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(278, 132, 21, 24));
-		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(299, 146, 8, 10));
-		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(269, 142, 8, 8));
+		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(278, 132, 278 + 21, 132 + 24));
+		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(299, 146, 299 + 8, 146 + 10));
+		_scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(269, 142, 269 + 8, 142 + 8));
 
-		_scene->_dynamicHotspots.add(NOUN_LIGHT_FIXTURE, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(102, 14, 24, 10));
+		_scene->_dynamicHotspots.add(NOUN_LIGHT_FIXTURE, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(102, 14, 102 + 24, 102 + 10));
 	}
 
 	_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 2);


Commit: 08cbf3d8436f83cc35a582b1bff56c158930f95e
    https://github.com/scummvm/scummvm/commit/08cbf3d8436f83cc35a582b1bff56c158930f95e
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-18T10:24:41+02:00

Commit Message:
MADS: Phantom: Fix code formatting

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 523a33f..b7199bd 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -188,8 +188,8 @@ void Scene101::enter() {
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1);
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 8), 1);
 
-		_anim0Running  = true;
-		_anim1Running  = true;
+		_anim0Running = true;
+		_anim1Running = true;
 
 		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
@@ -470,7 +470,7 @@ void Scene101::handleAnimation0() {
 			break;
 
 		case 53:
-			_anim0Running    = false;
+			_anim0Running = false;
 			_scene->freeAnimation(0);
 			break;
 
@@ -903,7 +903,7 @@ void Scene103::enter() {
 	adjustRails(_scene->_initialVariant);
 
 	_scene->_hotspots.activate(NOUN_JACQUES, false);
-	_scene->_hotspots.activate(NOUN_KEY,  false);
+	_scene->_hotspots.activate(NOUN_KEY, false);
 
 	_vm->_gameConv->get(12);
 
@@ -1739,7 +1739,7 @@ void Scene103::actions() {
 	}
 
 	if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) || _climbThroughTrapFl) {
-		if ((_standPosition == 2) && (_globals[kTrapDoorStatus] == 0))  {
+		if ((_standPosition == 2) && (_globals[kTrapDoorStatus] == 0)) {
 			switch (_game._trigger) {
 			case 0:
 			case 120:
@@ -1806,14 +1806,14 @@ void Scene103::actions() {
 			switch (_game._trigger) {
 			case 0:
 				_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('l', 1), 1);
-				_anim1ActvFl   = true;
+				_anim1ActvFl = true;
 				_game._player._visible = false;
 				_game._player._stepEnabled = false;
 				_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
 				break;
 
 			case 1:
-				_anim1ActvFl    = false;
+				_anim1ActvFl = false;
 				_game._player._visible = true;
 				_globals[kTrapDoorStatus] = 0;
 				_game._player._stepEnabled = true;
@@ -2276,7 +2276,7 @@ void Scene103::climbLeftStairs() {
 		return;
 
 	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[5]);
-	int stairs_reset_frame  = -1;
+	int stairs_reset_frame = -1;
 
 	if (_lastStairFrame == 34) {
 		stairs_reset_frame = 33;
@@ -2980,7 +2980,7 @@ void Scene104::processConversations() {
 		_vm->_gameConv->setInterlocutorTrigger(75);
 		_vm->_gameConv->setHeroTrigger(79);
 		interlocutorTriggerFl = true;
-		heroTriggerFl  = true;
+		heroTriggerFl = true;
 		break;
 
 	case 23:
@@ -3273,10 +3273,10 @@ void Scene104::handleCoupleAnimations() {
 			if (_womanTalkCount > 15) {
 				if (_needToGetUp) {
 					_coupleStatus = 6;
-					resetFrame   = 1;
+					resetFrame = 1;
 				} else {
 					_coupleStatus = 11;
-					resetFrame   = 0;
+					resetFrame = 0;
 				}
 			}
 		}
@@ -3312,6 +3312,9 @@ void Scene104::handleCoupleAnimations() {
 			else
 				_coupleStatus = 1;
 			break;
+
+		default:
+			break;
 		}
 
 		random = -1;
@@ -3630,7 +3633,7 @@ void Scene105::enter() {
 	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
 	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
 	if (_globals[kCurrentYear] == 1993)
-		_globals._spriteIndexes[3]       = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
 
 	if ((_globals[kCurrentYear] == 1881) && (!_globals[kHintThatDaaeIsHome2])) {
 		if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2) &&
@@ -3642,7 +3645,7 @@ void Scene105::enter() {
 	}
 
 	if ((_game._objects.isInRoom(OBJ_LANTERN)) && (_globals[kCurrentYear] == 1881)) {
-		_globals._spriteIndexes[0]  = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
 		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 	} else {
@@ -3650,7 +3653,7 @@ void Scene105::enter() {
 	}
 
 	if (_game._objects.isInRoom(OBJ_RED_FRAME)) {
-		_globals._spriteIndexes[1]  = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 	} else {
@@ -3711,12 +3714,12 @@ void Scene105::step() {
 	switch (_game._trigger) {
 	case 60:
 		_scene->deleteSequence(_globals._sequenceIndexes[2]);
-		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);   
+		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
 		_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 8);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 61);
 		_vm->_sound->command(66);
-		break; 
+		break;
 
 	case 61:
 		_vm->_sound->command(25);
@@ -3827,7 +3830,7 @@ void Scene105::actions() {
 			}
 
 			_game._player._stepEnabled = false;
-			_game._player._visible = false;  
+			_game._player._visible = false;
 			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[5], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
@@ -3843,7 +3846,7 @@ void Scene105::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]); 
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
 			_game._player._visible = true;
 			_scene->_sequences.setTimingTrigger(20, 3);
 			break;
@@ -3866,7 +3869,7 @@ void Scene105::actions() {
 		case (0):
 			_globals[kPlayerScore] += 5;
 			_game._player._stepEnabled = false;
-			_game._player._visible = false;  
+			_game._player._visible = false;
 			_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
@@ -3882,7 +3885,7 @@ void Scene105::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]); 
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]);
 			_game._player._visible = true;
 			_scene->_sequences.setTimingTrigger(20, 3);
 			break;
@@ -3905,7 +3908,7 @@ void Scene105::actions() {
 			switch (_game._trigger) {
 			case (0):
 				_game._player._stepEnabled = false;
-				_game._player._visible = false;  
+				_game._player._visible = false;
 				_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
@@ -3925,17 +3928,17 @@ void Scene105::actions() {
 			case 65:
 				_vm->_sound->command(24);
 				_scene->deleteSequence(_globals._sequenceIndexes[2]);
-				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);   
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 8);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
 				_vm->_sound->command(66);
-				break; 
+				break;
 
 			case 66: {
 				int tmpIdx = _globals._sequenceIndexes[2];
 				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 8);
-				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, tmpIdx); 
+				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, tmpIdx);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 				_game._player.walk(Common::Point(0, 111), FACING_NORTHWEST);
 				}
@@ -3948,7 +3951,7 @@ void Scene105::actions() {
 			switch (_game._trigger) {
 			case (0):
 				_game._player._stepEnabled = false;
-				_game._player._visible = false;  
+				_game._player._visible = false;
 				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], true, 5, 1);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
@@ -3958,12 +3961,12 @@ void Scene105::actions() {
 			case 1: {
 				int tmpIdx = _globals._sequenceIndexes[6];
 				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], true, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx); 
+				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false);
 				_vm->_sound->command(73);
 				_scene->_sequences.setTimingTrigger(15, 2);
 				}
-				break; 
+				break;
 
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[6]);
@@ -3974,7 +3977,7 @@ void Scene105::actions() {
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]); 
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]);
 				_game._player._visible = true;
 				if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
 					_vm->_dialogs->show(32);
@@ -4015,7 +4018,7 @@ void Scene105::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_LANTERN) && _game._objects.isInRoom(OBJ_LANTERN))  {
+		if (_action.isAction(NOUN_LANTERN) && _game._objects.isInRoom(OBJ_LANTERN)) {
 			_vm->_dialogs->show(10514);
 			_action._inProgress = false;
 			return;
@@ -4160,11 +4163,11 @@ void Scene105::actions() {
 }
 
 void Scene105::preActions() {
-  if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_PIT))
-    _game._player._walkOffScreenSceneId = 102;
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_PIT))
+		_game._player._walkOffScreenSceneId = 102;
 
-  if (_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR))
-	  _game._player.walk(Common::Point(33, 128), FACING_NORTHWEST);
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR))
+		_game._player.walk(Common::Point(33, 128), FACING_NORTHWEST);
 }
 
 /*------------------------------------------------------------------------*/


Commit: aa61aabdaf25ccfb7997592d62838090894e52c6
    https://github.com/scummvm/scummvm/commit/aa61aabdaf25ccfb7997592d62838090894e52c6
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-18T14:59:13+02:00

Commit Message:
MADS: Phantom: Implement scene 106

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 4e474a8..31b50fe 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -53,7 +53,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 105:	// ground floor, storage room
 		return new Scene105(vm);
 	case 106:	// behind stage
-		return new DummyScene(vm);	// TODO
+		return new Scene106(vm);
 	case 107:	// stage right wing
 		return new DummyScene(vm);	// TODO
 	case 108:	// stage left wing
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index b7199bd..5357cfe 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -4172,5 +4172,580 @@ void Scene105::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene106::Scene106(MADSEngine *vm) : Scene1xx(vm) {
+	_sandbagHostpotId = -1;
+}
+
+void Scene106::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsSint16LE(_sandbagHostpotId);
+}
+
+void Scene106::setup() {
+	if (_globals[kCurrentYear] == 1881)
+		_scene->_initialVariant = 1;
+
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene106::enter() {
+	_scene->loadSpeech(8);
+
+	if (_globals[kCurrentYear] == 1993) {
+		if (!_game._objects.isInInventory(OBJ_SANDBAG)) {
+			_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9", false);
+			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		}
+	} else {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		if (_game._objects.isInRoom(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
+			_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9", false);
+			_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+		}
+	}
+
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 2), false);
+
+	if ((_globals[kCurrentYear] == 1881) && (!_globals[kHintThatDaaeIsHome1])) {
+		if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2)
+		 && (_globals[kPanelIn206]) && (_globals[kDoneRichConv203]) && (_game._objects.isInInventory(OBJ_LANTERN))
+		 && ((_game._objects.isInInventory(OBJ_CABLE_HOOK) && _game._objects.isInInventory(OBJ_ROPE))
+		   || _game._objects.isInInventory(OBJ_ROPE_WITH_HOOK))) {
+			_globals[kHintThatDaaeIsHome1] = true;
+			_scene->_sequences.setTimingTrigger(300, 85);
+		}
+	}
+
+	if ((_globals[kSandbagStatus] == 1) && (_globals[kCurrentYear] == 1993) && _game._objects.isInRoom(OBJ_SANDBAG)) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+		_sandbagHostpotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(227, 140, 227 + 18, 140 + 11));
+		_scene->_dynamicHotspots.setPosition(_sandbagHostpotId, Common::Point(224, 152), FACING_NORTHEAST);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+	} 
+
+	if (_globals[kCurrentYear] == 1881) {
+		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_BIG_PROP, false);
+		_scene->_hotspots.activate(NOUN_STATUE, false);
+		_scene->_hotspots.activate(NOUN_PLANT_PROP, false);
+		_scene->_hotspots.activate(NOUN_PEDESTAL, false);
+		_scene->_hotspots.activate(NOUN_SANDBAG, false);
+		_scene->_hotspots.activate(NOUN_CRATE, false);
+
+		_scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(40, 47, 40 + 11, 47 + 17));
+		_scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(98, 14, 98 + 5, 14 + 10));
+		_scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(111, 23, 111 + 6, 23 + 9));
+		_scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(119, 12, 119 + 5, 12 + 8));
+
+		int idx = _scene->_dynamicHotspots.add(NOUN_STAGE, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(80, 114, 80 + 24, 114 + 4));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(93, 121), FACING_NONE);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_STAGE, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(106, 102, 106 + 5, 102 + 10));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(108, 109), FACING_NONE);
+	} else {
+		_scene->_hotspots.activate(NOUN_BOXES, false);
+		_scene->_hotspots.activate(NOUN_CASE, false);
+	}
+
+	if ((_game._objects.isInRoom(OBJ_CABLE_HOOK)) && (_globals[kCurrentYear] == 1881) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)){
+		_globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 3);
+	} else {
+		_scene->_hotspots.activate(NOUN_CABLE_HOOK, false);
+	}
+
+	if (_scene->_priorSceneId == 109) {
+		_game._player._playerPos = Common::Point(180, 58);
+		_game._player._facing = FACING_SOUTH;
+		_game._player.walk(Common::Point(179, 63), FACING_SOUTH);
+		_game._player.setWalkTrigger(60);
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 5);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	} else if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId == 301)) {
+		_game._player._playerPos = Common::Point(235, 142);
+		_game._player._facing = FACING_WEST;
+		_game._player.walk(Common::Point(227, 143), FACING_WEST);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	} else if (_scene->_priorSceneId == 107) {
+		_game._player._playerPos = Common::Point(143, 68);
+		_game._player._facing = FACING_WEST;
+		_game._player.walk(Common::Point(163, 68), FACING_SOUTHEAST);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	} else if ((_scene->_priorSceneId == 108) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player.firstWalk(Common::Point(-20, 130), FACING_SOUTHEAST, Common::Point(19, 147), FACING_NORTHEAST, true);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	} else if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene106::step() {
+	switch (_game._trigger) {
+	case 85:
+		_scene->playSpeech(8);
+		_scene->_sequences.setTimingTrigger(120, 86);
+		break;
+
+	case 86:
+		_vm->_dialogs->show(10637);
+		break;
+
+	case 60:
+		_scene->deleteSequence(_globals._sequenceIndexes[2]);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+		_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 5);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 61);
+		break;
+
+	case 61:
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+		_vm->_sound->command(25);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene106::actions() {
+	if ((_action.isAction(VERB_TAKE, NOUN_SANDBAG)) && (_scene->_customDest.y < 61)) {
+		_vm->_dialogs->show(10635);
+		_action._inProgress = false;
+		return;
+	} else if (_action.isAction(VERB_TAKE, NOUN_SANDBAG)) {
+		if (_game._objects.isInRoom(OBJ_SANDBAG)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 2);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[5], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 2);
+				break;
+
+			case 1:
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_scene->_dynamicHotspots.remove(_sandbagHostpotId);
+				_vm->_sound->command(26);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+				_game._player._visible = true;
+				_scene->_sequences.setTimingTrigger(20, 3);
+				break;
+
+			case 3:
+				_game._objects.addToInventory(OBJ_SANDBAG);
+				_vm->_dialogs->showItem(OBJ_SANDBAG, 803, 0);
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		} 
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CABLE_HOOK)) {
+		if (_game._objects.isInRoom(OBJ_CABLE_HOOK)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[5], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5],
+					2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 2);
+				_globals[kPlayerScore] += 5;
+				break;
+
+			case 1:
+				_scene->deleteSequence(_globals._sequenceIndexes[8]);
+				_scene->_hotspots.activate(NOUN_CABLE_HOOK, false);
+				_vm->_sound->command(26);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+				_game._player._visible = true;
+				_scene->_sequences.setTimingTrigger(20, 3);
+				break;
+
+			case 3:
+				_game._objects.addToInventory(OBJ_CABLE_HOOK);
+				_vm->_dialogs->showItem(OBJ_CABLE_HOOK, 822, 0);
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		} 
+	}
+
+	switch (_game._trigger) {
+	case 75:
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 76);
+		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+		_action._inProgress = false;
+		return;
+		break;
+
+	case 76:
+		_scene->_nextSceneId = 105;
+		_action._inProgress = false;
+		return;
+		break;
+
+	case 80:
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 81);
+		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+		_action._inProgress = false;
+		return;
+		break;
+
+	case 81:
+		_scene->_sequences.setTimingTrigger(120, 82);
+		_action._inProgress = false;
+		return;
+		break;
+
+	case 82:
+		_scene->_nextSceneId = 301;
+		_action._inProgress = false;
+		return;
+		break;
+
+	default:
+		break;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_STAGE_RIGHT_WING)) {
+		_scene->_nextSceneId = 107;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_DOWN) || _action.isAction(VERB_CLIMB_UP)) {
+		if (_globals[kSandbagStatus] == 1) {
+			switch (_game._trigger) {
+			case 0:
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s',-1), 1);
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				break;
+
+			case 1:
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+				_game._player._visible = true;
+				_game._player._playerPos = Common::Point(225, 143);
+				_game._player.resetFacing(FACING_EAST);
+				_game._player.walk(Common::Point(236, 142), FACING_EAST);
+
+				if (_action.isAction(VERB_CLIMB_DOWN))
+					_game._player.setWalkTrigger(75);
+				else
+					_game._player.setWalkTrigger(80);
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			switch (_game._trigger) {
+			case 0:
+				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 9);
+				_scene->_sequences.setTimingTrigger(6, 2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
+				break;
+
+			case 1:
+				_vm->_sound->command(70);
+				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+				_sandbagHostpotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(227, 140, 227 + 18, 140 + 11));
+				_scene->_dynamicHotspots.setPosition(_sandbagHostpotId, Common::Point(224, 152), FACING_NORTHEAST);
+				break;
+
+			case 2:
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 1), 3);
+				_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+				break;
+
+			case 3:
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				_game._player._playerPos = Common::Point(228, 140);
+				_game._player.resetFacing(FACING_SOUTHEAST);
+				_globals[kSandbagStatus] = 1;
+				_vm->_dialogs->show(10632);
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[3], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 4, 65);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 67);
+			break;
+
+		case 65:
+			_vm->_sound->command(24);
+			_scene->deleteSequence(_globals._sequenceIndexes[2]);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 5);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
+			break;
+
+		case 66: {
+			int idx = _globals._sequenceIndexes[2];
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 5);
+			_game.syncTimers(1, _globals._sequenceIndexes[2], 1, idx);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+			}
+			break;
+
+		case 67:
+			_game._player._visible = true;
+			_game._player.walk(Common::Point(180, 60), FACING_NORTH);
+			_game._player.setWalkTrigger(68);
+			break;
+
+		case 68:
+			_scene->deleteSequence(_globals._sequenceIndexes[2]);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[2], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 69);
+			break;
+
+		case 69:
+			_vm->_sound->command(25);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+			_scene->_nextSceneId = 109;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10610);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_STAGE_RIGHT_WING)) {
+			_vm->_dialogs->show(10611);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGE_LEFT_WING)) {
+			_vm->_dialogs->show(10612);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_IN_TWO)) {
+			_vm->_dialogs->show(10613);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CYCLORAMA)) {
+			_vm->_dialogs->show(10614);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGE)) {
+			_vm->_dialogs->show(10615);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PEDESTAL)) {
+			_vm->_dialogs->show(10616);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PLANT_PROP)) {
+			_vm->_dialogs->show(10617);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_SANDBAG)) {
+			if (_scene->_customDest.y < 60) {
+				_vm->_dialogs->show(10618);
+				_action._inProgress = false;
+				return;
+			} else if (_game._objects.isInRoom(OBJ_SANDBAG)) {
+				_vm->_dialogs->show(10633);
+				_action._inProgress = false;
+				return;
+			}
+		}
+
+		if (_action.isAction(NOUN_STATUE)) {
+			_vm->_dialogs->show(10619);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CIRCULAR_STAIRCASE)) {
+			_vm->_dialogs->show(10620);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BATTEN)) {
+			_vm->_dialogs->show(10621);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DOOR)) {
+			_vm->_dialogs->show(10622);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BOXES) || _action.isAction(NOUN_BOX)) {
+			_vm->_dialogs->show(10623);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BIG_PROP)) {
+			_vm->_dialogs->show(10624);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CRATE)) {
+			_vm->_dialogs->show(10625);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CASE)) {
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->show(10638);
+			else
+				_vm->_dialogs->show(10636);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_VENTILATION_DUCT)) {
+			_vm->_dialogs->show(10626);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_JUNK)) {
+			_vm->_dialogs->show(10627);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_FLATS)) {
+			_vm->_dialogs->show(10628);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(10629);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CABLE_HOOK) && _game._objects.isInRoom(OBJ_CABLE_HOOK)) {
+			_vm->_dialogs->show(10639);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_STATUE)) {
+		_vm->_dialogs->show(10630);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) {
+		_vm->_dialogs->show(10634);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene106::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_STAGE_LEFT_WING))
+		_game._player._walkOffScreenSceneId = 108;
+
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+		_game._player.walk(Common::Point(179, 63), FACING_NORTHWEST);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 83b94ba..1c3ab89 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -206,6 +206,19 @@ public:
 	virtual void actions();
 };
 
+class Scene106 : public Scene1xx {
+private:
+	int _sandbagHostpotId;
+public:
+	Scene106(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 5f3c0cf63aeaf46f30f40a5b7f9a119199dcc194
    https://github.com/scummvm/scummvm/commit/5f3c0cf63aeaf46f30f40a5b7f9a119199dcc194
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-18T20:51:42+02:00

Commit Message:
MADS: Phantom: Add logic for scene 107

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 31b50fe..313a494 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -55,7 +55,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 106:	// behind stage
 		return new Scene106(vm);
 	case 107:	// stage right wing
-		return new DummyScene(vm);	// TODO
+		return new Scene107(vm);
 	case 108:	// stage left wing
 		return new DummyScene(vm);	// TODO
 	case 109:	// upper floor, staircase
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 5357cfe..cb080c6 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -4747,5 +4747,276 @@ void Scene106::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene107::Scene107(MADSEngine *vm) : Scene1xx(vm) {
+}
+
+void Scene107::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+}
+
+void Scene107::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene107::enter() {
+	if (_globals[kCurrentYear] == 1993)
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+
+	if (_game._objects.isInRoom(OBJ_YELLOW_FRAME)) {
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
+	}
+
+	if (_game._objects.isInRoom(OBJ_YELLOW_FRAME)) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	} else {
+		_scene->_hotspots.activate(NOUN_YELLOW_FRAME, false);
+	}
+
+	if (_globals[kCurrentYear] == 1993) {
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_PROP_TABLE, false);
+	} else {
+		_scene->_hotspots.activate(NOUN_HEADSET, false);
+	}
+
+	if (_scene->_priorSceneId == 106) {
+		_game._player._playerPos = Common::Point(276, 73);
+		_game._player._facing = FACING_SOUTHWEST;
+		_game._player.walk(Common::Point(248, 75), FACING_SOUTHWEST);
+	} else if ((_scene->_priorSceneId == 104) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		if (_game._player._playerPos.y > 128) {
+			_game._player._playerPos.x = 216;
+			_game._player._facing = FACING_NORTHWEST;
+		} else if (_game._player._playerPos.y > 99) {
+			_game._player._playerPos.x = 127;
+			_game._player._facing = FACING_NORTHWEST;
+		} else {
+			_game._player._playerPos.x = 44;
+			_game._player._facing = FACING_NORTHEAST;
+		}
+		_game._player._playerPos.y = 143;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene107::step() {
+}
+
+void Scene107::actions() {
+	if (_action.isAction(VERB_WALK_ONTO, NOUN_STAGE)) {
+		_scene->_nextSceneId = 104;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK, NOUN_BACKSTAGE)) {
+		_scene->_nextSceneId = 106;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME) && (_game._objects.isInRoom(OBJ_YELLOW_FRAME) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			if (_globals[kCurrentYear] == 1881) {
+				int count = 0;
+				if (_game._objects.isInInventory(OBJ_GREEN_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_RED_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_BLUE_FRAME))
+					++count;
+
+				if (count < 3)
+					_globals[kPlayerScore] += 5;
+			}
+
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 5);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[2]);
+			_scene->_hotspots.activate(NOUN_YELLOW_FRAME, false);
+			_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 843, 0);
+			else
+				_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10710);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_STAGE)) {
+			_vm->_dialogs->show(10711);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_IN_TWO)) {
+			_vm->_dialogs->show(10712);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_IN_ONE)) {
+			_vm->_dialogs->show(10713);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CYCLORAMA)) {
+			_vm->_dialogs->show(10714);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_COUNTERWEIGHT_SYSTEM)) {
+			_vm->_dialogs->show(10715);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PURCHASE_LINES)) {
+			_vm->_dialogs->show(10716);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LOCKRAIL)) {
+			_vm->_dialogs->show(10717);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGE)) {
+			_vm->_dialogs->show(10718);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROP_TABLE)) {
+			_vm->_dialogs->show(10719);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_ACT_CURTAIN)) {
+			_vm->_dialogs->show(10720);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LEG)) {
+			_vm->_dialogs->show(10721);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_APRON)) {
+			_vm->_dialogs->show(10722);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROSCENIUM_ARCH)) {
+			_vm->_dialogs->show(10723);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGE)) {
+			_vm->_dialogs->show(10724);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BACKSTAGE)) {
+			_vm->_dialogs->show(10725);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_YELLOW_FRAME) && _game._objects.isInRoom(OBJ_YELLOW_FRAME)) {
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->show(10727);
+			else
+				_vm->_dialogs->show(10726);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_HEADSET)) {
+			_vm->_dialogs->show(10728);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(10730);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_HEADSET)) {
+		_vm->_dialogs->show(10729);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_HEADSET)) {
+		_vm->_dialogs->show(10732);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PULL, NOUN_PURCHASE_LINES)) {
+		_vm->_dialogs->show(10731);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene107::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 1c3ab89..ad91b8e 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -193,8 +193,6 @@ public:
 };
 
 class Scene105 : public Scene1xx {
-private:
-
 public:
 	Scene105(MADSEngine *vm);
 	virtual void synchronize(Common::Serializer &s);
@@ -219,6 +217,20 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene107 : public Scene1xx {
+private:
+
+public:
+	Scene107(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 7a56c52c89d8a6afc391b1f8181dcad56ad3997e
    https://github.com/scummvm/scummvm/commit/7a56c52c89d8a6afc391b1f8181dcad56ad3997e
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-18T23:57:38+02:00

Commit Message:
MADS: Phantom: Fix some hotspot rects in scene 103, implement scene 108

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 313a494..4d8a411 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -57,7 +57,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 107:	// stage right wing
 		return new Scene107(vm);
 	case 108:	// stage left wing
-		return new DummyScene(vm);	// TODO
+		return new Scene108(vm);
 	case 109:	// upper floor, staircase
 		return new DummyScene(vm);	// TODO
 	case 110:	// outside dressing rooms 1
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index cb080c6..14b5be3 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -993,7 +993,7 @@ void Scene103::enter() {
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(155, 144), FACING_NONE);
 
-			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(187, 136, 8, 7));
+			tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(187, 136, 187 + 8, 136 + 7));
 			_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(195, 139), FACING_NONE);
 		} else if ((_globals[kJacquesStatus] >= 1) && (_globals[kCurrentYear] == 1881)) {
@@ -1550,23 +1550,23 @@ void Scene103::actions() {
 						_scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST);
 
-						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(42, 67, 16, 75));
+						_hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(42, 67, 42 + 16, 67 + 75));
 						_scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(59, 140), FACING_NORTHWEST);
 
-						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(58, 90, 18, 52));
+						_hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(58, 90, 58 + 18, 90 + 52));
 						_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST);
 
-						_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 137, 40, 5));
+						_hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 137, 35 + 40, 137 + 5));
 						_scene->_dynamicHotspots[_hotspotLeftFloor1]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor1, Common::Point(59, 140), FACING_NONE);
 
-						_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(76, 129, 6, 6));
+						_hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(76, 129, 76 + 6, 129 + 6));
 						_scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE);
 
-						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 40, 30));
+						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 2 + 40, 49 + 30));
 						_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST);
 						_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
@@ -2335,7 +2335,7 @@ void Scene103::process_conv_jacques() {
 		if (_globals[kJacquesNameIsKnown] == 0) {
 			_globals[kJacquesNameIsKnown] = 1;
 			_scene->_dynamicHotspots.remove(_hotspotGentleman);
-			_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(156, 116, 33, 31));
+			_hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(156, 116, 156 + 33, 116 + 31));
 			_scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST);
 		}
@@ -4852,7 +4852,7 @@ void Scene107::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_scene->_sequences.setTimingTrigger(20, 3);
 			break;
@@ -5017,6 +5017,595 @@ void Scene107::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene108::Scene108(MADSEngine *vm) : Scene1xx(vm) {
+	_anim0ActvFl = false;
+	_handRaisedFl = false;
+	_shutUpCount = -1;
+	_maxTalkCount = -1;
+	_charAction = -1;
+	_charFrame = -1;
+	_charHotspotId = -1;
+	_charTalkCount = -1;
+	_conversationCount = -1;
+	_prevShutUpFrame = -1;
+}
+
+void Scene108::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_handRaisedFl);
+	s.syncAsSint16LE(_shutUpCount);
+	s.syncAsSint16LE(_maxTalkCount);
+	s.syncAsSint16LE(_charAction);
+	s.syncAsSint16LE(_charFrame);
+	s.syncAsSint16LE(_charHotspotId);
+	s.syncAsSint16LE(_charTalkCount);
+	s.syncAsSint16LE(_conversationCount);
+	s.syncAsSint16LE(_prevShutUpFrame);
+}
+
+void Scene108::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+	
+	if (_globals[kCurrentYear] == 1993)
+		_scene->_initialVariant = 1;
+
+	_scene->addActiveVocab(NOUN_GENTLEMAN);
+	_scene->addActiveVocab(NOUN_CHARLES);
+}
+
+void Scene108::enter() {
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_handRaisedFl = false;
+		_charTalkCount = 0;
+		_shutUpCount = 40;
+		_maxTalkCount = 15;
+	}
+
+	_vm->_gameConv->get(2);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_scene->_hotspots.activate(NOUN_STOOL, false);
+		int idx = _scene->_dynamicHotspots.add(NOUN_STOOL, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(250, 68, 250 + 8, 68 + 21));
+		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(253, 75), FACING_SOUTHEAST);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+	} else {
+		_scene->_hotspots.activate(NOUN_HEADSET, false);
+		int idx = _scene->_dynamicHotspots.add(NOUN_WALL, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(258, 58, 258 + 6, 58 + 10));
+		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(236, 69), FACING_NORTHEAST);
+	}
+
+	if ((_globals[kCurrentYear] == 1993) && (_globals[kDoneBrieConv203] == 0)) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('c', 1), 1);
+		_anim0ActvFl = true;
+
+		if (_vm->_gameConv->_running == 2) {
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+			_charAction = 0;
+			_vm->_gameConv->run(2);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_vm->_gameConv->exportValue(_globals[kJulieNameIsKnown]);
+			_vm->_gameConv->exportValue(_globals[kObservedPhan104]);
+			_scene->setAnimFrame(_globals._animationIndexes[0], 55);
+			_shutUpCount = 40;
+		} else {
+			_charAction = 2;
+		}
+
+		if (_globals[kCharlesNameIsKnown]) {
+			_charHotspotId = _scene->_dynamicHotspots.add(NOUN_CHARLES, VERB_WALK_TO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(253, 52, 253 + 15, 52 + 34));
+			_scene->_dynamicHotspots[_charHotspotId]._articleNumber = PREP_ON;
+		} else {
+			_charHotspotId = _scene->_dynamicHotspots.add(NOUN_GENTLEMAN, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(253, 52, 253 + 15, 52 + 34));
+			_scene->_dynamicHotspots[_charHotspotId]._articleNumber = PREP_ON;
+		}
+		_scene->_dynamicHotspots.setPosition(_charHotspotId, Common::Point(235, 102), FACING_NORTHEAST);
+	} 
+
+	if (_scene->_priorSceneId == 106) {
+		_game._player._playerPos = Common::Point(48, 81);
+		_game._player._facing = FACING_SOUTHEAST;
+		_game._player.walk(Common::Point(71, 76), FACING_SOUTHEAST);
+	} else if ((_scene->_priorSceneId == 104) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		if (_game._player._playerPos.y > 128) {
+			_game._player._playerPos.x = 124;
+			_game._player._facing = FACING_NORTHEAST;
+		} else if (_game._player._playerPos.y > 99) {
+			_game._player._playerPos.x = 185;
+			_game._player._facing = FACING_NORTHEAST;
+		} else {
+			_game._player._playerPos.x = 243;
+			_game._player._facing = FACING_NORTHWEST;
+		}
+
+		_game._player._playerPos.y = 143;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene108::step() {
+	if (_anim0ActvFl)
+		handle_animation_char ();
+
+	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
+		++_conversationCount;
+		if (_conversationCount > 200)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+}
+
+void Scene108::actions() {
+	if (_vm->_gameConv->_running == 2) {
+		process_conversation_charles();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_GENTLEMAN) || _action.isAction(VERB_TALK_TO, NOUN_CHARLES)) {
+		_charAction = 6;
+		_game._player._stepEnabled = false;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_ONTO, NOUN_STAGE)) {
+		_scene->_nextSceneId = 104;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK, NOUN_BACKSTAGE)) {
+		_scene->_nextSceneId = 106;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10810);
+		_action._inProgress = false;
+		return;
+	} 
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(10730);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGE)) {
+			_vm->_dialogs->show(10811);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_IN_TWO)) {
+			_vm->_dialogs->show(10812);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_IN_ONE)) {
+			_vm->_dialogs->show(10813);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PROSCENIUM_ARCH)) {
+			_vm->_dialogs->show(10814);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_ACT_CURTAIN)) {
+			_vm->_dialogs->show(10815);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LEG)) {
+			_vm->_dialogs->show(10816);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CYCLORAMA)) {
+			_vm->_dialogs->show(10817);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_FLATS)) {
+			_vm->_dialogs->show(10818);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGEMANAGERS_POST)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(10819);
+			else
+				_vm->_dialogs->show(10820);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STOOL)) {
+			_vm->_dialogs->show(10821);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BACKSTAGE)) {
+			_vm->_dialogs->show(10822);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAGE)) {
+			_vm->_dialogs->show(10823);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_HEADSET)) {
+			_vm->_dialogs->show(10824);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(10826);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CHARLES) || _action.isAction(NOUN_GENTLEMAN)) {
+			_vm->_dialogs->show(10827);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CHARLES) || _action.isAction(VERB_TAKE, NOUN_GENTLEMAN)) {
+		_vm->_dialogs->show(10828);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_HEADSET)) {
+		_vm->_dialogs->show(10825);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_STOOL) && (_globals[kCurrentYear] == 1993)) {
+		_vm->_dialogs->show(10829);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_HEADSET)) {
+		_vm->_dialogs->show(10830);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene108::preActions() {
+}
+
+void Scene108::handle_animation_char() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _charFrame)
+		return;
+
+	_charFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random = -1;
+
+	switch (_charFrame) {
+	case 1:
+	case 2:
+	case 3:
+	case 4:
+	case 92:
+		if (_charAction == 2)
+			random = _vm->getRandomNumber(2, 15);
+
+		if (_charAction == 6) {
+			_charTalkCount = 0;
+			_charAction = 1;
+			random = 1;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 5;
+			break;
+
+		case 2:
+			resetFrame = 0;
+			break;
+
+		case 3:
+			resetFrame = 1;
+			break;
+
+		case 4:
+			resetFrame = 2;
+			break;
+
+		default:
+			resetFrame = 3;
+			break;
+		}
+		break;
+
+	case 18:
+	case 19:
+	case 20:
+	case 21:
+	case 27:
+	case 33:
+	case 41:
+	case 51:
+	case 52:
+	case 53:
+	case 54:
+	case 55:
+	case 56:
+	case 57:
+	case 62:
+	case 73:
+		if (_charFrame == 18) {
+			_game._player._stepEnabled = true;
+			_vm->_gameConv->run(2);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_vm->_gameConv->exportValue(_globals[kJulieNameIsKnown]);
+			_vm->_gameConv->exportValue(_globals[kObservedPhan104]);
+		}
+
+		if (_charAction == 1) {
+			if (_handRaisedFl) {
+				random = _vm->getRandomNumber(1, 3);
+			} else {
+				random = _vm->getRandomNumber(1, 4);
+				if (random == 4)
+					random = _vm->getRandomNumber(1, 4);
+			}
+
+			if (random == 4)
+				_handRaisedFl = true;
+
+			++_charTalkCount;
+			if (_charTalkCount > _maxTalkCount) {
+				_charAction = 0;
+				_shutUpCount = 0;
+				_prevShutUpFrame = 10;
+				random = 12;
+			} 
+		} else if (_charAction == 0) {
+			int delay = _vm->getRandomNumber(10, 15);
+			++_shutUpCount;
+			if (_shutUpCount > delay) {
+				random = _vm->getRandomNumber(10, 16);
+				_prevShutUpFrame = random;
+				if (random == 15)
+					_shutUpCount = 16;
+				else
+					_shutUpCount = 0;
+			} else {
+				random = _prevShutUpFrame;
+			}
+		} else if (_charAction == 7) {
+			_charAction = 1;
+			random = 5;
+		} else if (_charAction == 3) {
+			_charAction = 1;
+			random = 6;
+		} else if (_charAction == 5) {
+			_charAction = 1;
+			random = 7;
+		} else if (_charAction == 4) {
+			_charAction = 1;
+			random = 8;
+		} else if (_charAction == 2) {
+			random = 9;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 18;
+			break;
+
+		case 2:
+			resetFrame = 19;
+			break;
+
+		case 3:
+			resetFrame = 20;
+			break;
+
+		case 4:
+			resetFrame = 62;
+			_charTalkCount += 5;
+			break;
+
+		case 5:
+			resetFrame = 21;
+			break;
+
+		case 6:
+			resetFrame = 41;
+			break;
+
+		case 7:
+			resetFrame = 33;
+			break;
+
+		case 8:
+			resetFrame = 27;
+			break;
+
+		case 9:
+			resetFrame = 74;
+			break;
+
+		case 10:
+			resetFrame = 51;
+			break;
+
+		case 11:
+			resetFrame = 53;
+			break;
+
+		case 12:
+			resetFrame = 54;
+			break;
+
+		case 13:
+			resetFrame = 55;
+			break;
+
+		case 14:
+			resetFrame = 56;
+			break;
+
+		case 15:
+			resetFrame = 57;
+			break;
+
+		case 16:
+			resetFrame = 52;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_charFrame = resetFrame;
+	}
+}
+
+void Scene108::process_conversation_charles() {
+	switch (_action._activeAction._verbId) {
+	case 1:
+	case 25:
+	case 26:
+		_globals[kWalkerConverse] = 0;
+		_vm->_gameConv->setHeroTrigger(64);
+		if (_action._activeAction._verbId == 26)
+			_globals[kCharlesNameIsKnown] = 2;
+		break;
+
+	case 2:
+		if (!_globals[kCharlesNameIsKnown]) {
+			_scene->_dynamicHotspots.remove(_charHotspotId);
+			_charHotspotId = _scene->_dynamicHotspots.add(NOUN_CHARLES, VERB_WALK_TO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(253, 52, 253 + 15, 52 + 34));
+			_scene->_dynamicHotspots[_charHotspotId]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(_charHotspotId, Common::Point(235, 102), FACING_NORTHEAST);
+			_globals[kCharlesNameIsKnown] = true;
+		}
+		break;
+
+	case 5:
+		_vm->_gameConv->setInterlocutorTrigger(66);
+		_maxTalkCount = 35;
+		break;
+
+	case 6:
+	case 8:
+	case 9:
+	case 10:
+	case 11:
+	case 12:
+	case 15:
+		_maxTalkCount = 35;
+		break;
+
+	case 16:
+		_vm->_gameConv->setInterlocutorTrigger(68);
+		_maxTalkCount = 35;
+		break;
+
+	case 19:
+		_vm->_gameConv->setInterlocutorTrigger(72);
+		break;
+
+	case 22:
+		_vm->_gameConv->setInterlocutorTrigger(70);
+		break;
+
+	default:
+		_maxTalkCount = 15;
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 60:
+		_charAction = 1;
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		break;
+
+	case 62:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+		_conversationCount = 0;
+		_charAction = 0;
+		break;
+
+	case 64:
+		_charAction = 2;
+		break;
+
+	case 66:
+		_charAction = 5;
+		break;
+
+	case 68:
+		_charAction = 4;
+		break;
+
+	case 70:
+		_charAction = 7;
+		break;
+
+	case 72:
+		_charAction = 3;
+		break;
+
+	default:
+		break;
+	} 
+
+	if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 5) &&
+		(_action._activeAction._verbId != 16) && (_action._activeAction._verbId != 19) &&
+		(_action._activeAction._verbId != 22) && (_action._activeAction._verbId != 25) &&
+		(_action._activeAction._verbId != 26) && (_charAction != 2)) {
+		_vm->_gameConv->setInterlocutorTrigger(60);
+		_vm->_gameConv->setHeroTrigger(62);
+	}
+
+	_charTalkCount = 0;
+	_shutUpCount = 40;
+	_handRaisedFl = false;
+}
+
+/*------------------------------------------------------------------------*/
 
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index ad91b8e..7a3b3fb 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -219,10 +219,35 @@ public:
 };
 
 class Scene107 : public Scene1xx {
+public:
+	Scene107(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
+class Scene108 : public Scene1xx {
 private:
+	bool _anim0ActvFl;
+	bool _handRaisedFl;
+	int _shutUpCount;
+	int _maxTalkCount;
+	int _charAction;
+	int _charFrame;
+	int _charTalkCount;
+	int _charHotspotId;
+	int _conversationCount;
+	int _prevShutUpFrame;
+
+	void handle_animation_char();
+	void process_conversation_charles();
 
 public:
-	Scene107(MADSEngine *vm);
+	Scene108(MADSEngine *vm);
 	virtual void synchronize(Common::Serializer &s);
 
 	virtual void setup();
@@ -231,6 +256,7 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 3488f05585a1c3491e90e3aa5d14fb34fcfb17d5
    https://github.com/scummvm/scummvm/commit/3488f05585a1c3491e90e3aa5d14fb34fcfb17d5
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-19T00:20:09+02:00

Commit Message:
MADS: Phantom: Some renaming in scene 108

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 14b5be3..0e50bf5 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -5132,7 +5132,7 @@ void Scene108::enter() {
 
 void Scene108::step() {
 	if (_anim0ActvFl)
-		handle_animation_char ();
+		handleCharAnimation ();
 
 	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
 		++_conversationCount;
@@ -5143,7 +5143,7 @@ void Scene108::step() {
 
 void Scene108::actions() {
 	if (_vm->_gameConv->_running == 2) {
-		process_conversation_charles();
+		handleCharlesConversation();
 		_action._inProgress = false;
 		return;
 	}
@@ -5303,7 +5303,7 @@ void Scene108::actions() {
 void Scene108::preActions() {
 }
 
-void Scene108::handle_animation_char() {
+void Scene108::handleCharAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _charFrame)
 		return;
 
@@ -5502,7 +5502,7 @@ void Scene108::handle_animation_char() {
 	}
 }
 
-void Scene108::process_conversation_charles() {
+void Scene108::handleCharlesConversation() {
 	switch (_action._activeAction._verbId) {
 	case 1:
 	case 25:
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 7a3b3fb..99146ae 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -243,8 +243,8 @@ private:
 	int _conversationCount;
 	int _prevShutUpFrame;
 
-	void handle_animation_char();
-	void process_conversation_charles();
+	void handleCharAnimation();
+	void handleCharlesConversation();
 
 public:
 	Scene108(MADSEngine *vm);


Commit: 7a6bc4f8cfb26ea58385f21886ad0a6b0dbb18a9
    https://github.com/scummvm/scummvm/commit/7a6bc4f8cfb26ea58385f21886ad0a6b0dbb18a9
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-19T07:15:42+02:00

Commit Message:
MADS: Phantom: Implement scene 109

Changed paths:
    engines/mads/game.cpp
    engines/mads/game.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/scene.cpp
    engines/mads/scene.h



diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index 311a95c..8ddfd1e 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -603,4 +603,7 @@ void Game::syncTimers(int slave_type, int slave_id, int master_type, int master_
 	warning("TODO: Game_syncTimers");
 }
 
+void Game::camPanTo(Camera *camera, int target) {
+	warning("TODO: Game::camPanTo");
+}
 } // End of namespace MADS
diff --git a/engines/mads/game.h b/engines/mads/game.h
index 2a1daac..c5dfcbb 100644
--- a/engines/mads/game.h
+++ b/engines/mads/game.h
@@ -238,6 +238,12 @@ public:
 
 	void syncTimers(int slave_type, int slave_id, int master_type, int master_id);
 
+	typedef struct {
+		//TODO
+	} Camera;
+	Camera _camX, _camY;
+	void camPanTo(Camera *camera, int target);
+
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 4d8a411..5c414d2 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -59,7 +59,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 108:	// stage left wing
 		return new Scene108(vm);
 	case 109:	// upper floor, staircase
-		return new DummyScene(vm);	// TODO
+		return new Scene109(vm);
 	case 110:	// outside dressing rooms 1
 		return new DummyScene(vm);	// TODO
 	case 111:	// outside dressing rooms 2
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 0e50bf5..cc84b6e 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -5607,5 +5607,512 @@ void Scene108::handleCharlesConversation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene109::Scene109(MADSEngine *vm) : Scene1xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+}
+
+void Scene109::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_anim3ActvFl);
+}
+
+void Scene109::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene109::enter() {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RDR_6", false);
+
+	if (_globals[kCurrentYear] == 1881) {
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
+
+		_scene->_hotspots.activate(NOUN_LIGHT_FIXTURE, false);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+		_scene->_sequences.setTimingTrigger(1, 70);
+	} else {
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 0), false);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 1), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('z', 2), false);
+
+		_scene->_hotspots.activate(NOUN_LAMP, false);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
+		_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 1);
+	}
+
+	if (_scene->_priorSceneId == 106) {
+		_game._player._playerPos = Common::Point(31, 459);
+		_game._player._facing = FACING_NORTHEAST;
+		_scene->setCamera(Common::Point(0, 312));
+		_scene->sceneScale(467, 95, 442, 78);
+		_currentFloor = 1;
+	} else if (_scene->_priorSceneId == 111) {
+		if (_globals[kLeaveAngelMusicOn]) {
+			_globals[kLeaveAngelMusicOn] = false;
+			sceneEntrySound();
+		}
+		_game._player._playerPos = Common::Point(4, 136);
+		_game._player._facing = FACING_EAST;
+		_game._player.walk(Common::Point(32, 138), FACING_EAST);
+		_game._player.setWalkTrigger(60);
+		_game._player._stepEnabled = false;
+		_scene->setCamera(Common::Point(0, 0));
+		_scene->sceneScale(155, 95, 130, 78);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 3);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_currentFloor = 3;
+	} else if ((_scene->_priorSceneId == 110) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(3, 292);
+		_game._player._facing = FACING_EAST;
+		_game._player.walk(Common::Point(31, 295), FACING_EAST);
+		_game._player.setWalkTrigger(65);
+		_game._player._stepEnabled = false;
+		_scene->setCamera(Common::Point(0, 156));
+		_scene->sceneScale(311, 95, 286, 78);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 3);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_currentFloor = 2;
+	} else if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		if (_currentFloor == 2) {
+			_scene->setCamera(Common::Point(0, 156));
+			_scene->sceneScale(311, 95, 286, 78);
+		} else if (_currentFloor == 3) {
+			_scene->setCamera(Common::Point(0, 0));
+			_scene->sceneScale(155, 95, 130, 78);
+		} else {
+			_scene->setCamera(Common::Point(0, 312));
+			_scene->sceneScale(467, 95, 442, 78);
+		}
+	}
+
+	sceneEntrySound();
+}
+
+void Scene109::step() {
+	if (_anim0ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 80)
+			_game.camPanTo(&_game._camY, 156);
+	}
+
+	if (_anim1ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == 80)
+			_game.camPanTo(&_game._camY, 0);
+	}
+
+	if (_anim2ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == 7)
+			_game.camPanTo(&_game._camY, 312);
+	}
+
+	if (_anim3ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 14)
+			_game.camPanTo(&_game._camY, 156);
+	}
+
+	switch (_game._trigger) {
+	case 60:
+		_scene->deleteSequence(_globals._sequenceIndexes[0]);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 3);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
+		break;
+
+	case 61:
+		_vm->_sound->command(25);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 65:
+		_scene->deleteSequence(_globals._sequenceIndexes[1]);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 3);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
+		break;
+
+	case 66:
+		_vm->_sound->command(25);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+
+	if (_game._trigger == 70) {
+		int rndFrame = _vm->getRandomNumber(1, 3);
+		int rndDelay = _vm->getRandomNumber(4, 7);
+		_scene->deleteSequence(_globals._sequenceIndexes[2]);
+		_scene->deleteSequence(_globals._sequenceIndexes[3]);
+		_scene->deleteSequence(_globals._sequenceIndexes[4]);
+
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, rndFrame);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, rndFrame);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, rndFrame);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+		_scene->_sequences.setTimingTrigger(rndDelay, 70);
+	}
+}
+
+void Scene109::actions() {
+	if (_action.isAction(VERB_WALK, NOUN_BACKSTAGE)) {
+		_scene->_nextSceneId = 106;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_UP, NOUN_STAIRCASE)) {
+		if (_currentFloor == 2) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player.walk(Common::Point(58, 295), FACING_EAST);
+				_game._player.setWalkTrigger(1);
+				break;
+
+			case 1:
+				_anim1ActvFl = true;
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('w', 2), 2);
+				_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+				_scene->sceneScale(155, 95, 130, 78);
+				_anim1ActvFl = false;
+				_game._player._visible = true;
+				_game._player._playerPos = Common::Point(261, 137);
+				_game._player.walk(Common::Point(281, 143), FACING_SOUTHWEST);
+				_game._player.setWalkTrigger(3);
+				break;
+
+			case 3:
+				_game._player._stepEnabled = true;
+				_currentFloor = 3;
+				break;
+
+			default:
+				break;
+			}
+		} else if (_currentFloor == 1) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player.walk(Common::Point(58, 452), FACING_EAST);
+				_game._player.setWalkTrigger(1);
+				break;
+
+			case 1:
+				_anim0ActvFl = true;
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('w', 1), 2);
+				_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+				_scene->sceneScale(311, 95, 286, 78);
+				_anim0ActvFl = false;
+				_game._player._visible = true;
+				_game._player._playerPos = Common::Point(264, 295);
+				_game._player.walk(Common::Point(289, 299), FACING_SOUTHWEST);
+				_game._player.setWalkTrigger(3);
+				break;
+
+			case 3:
+				_game._player._stepEnabled = true;
+				_currentFloor = 2;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_DOWN, NOUN_STAIRCASE)) {
+		if (_currentFloor == 2) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player.walk(Common::Point(287, 291), FACING_WEST);
+				_game._player.setWalkTrigger(1);
+				break;
+
+			case 1:
+				_game._player.walk(Common::Point(269, 292), FACING_WEST);
+				_game._player.setWalkTrigger(2);
+				break;
+
+			case 2:
+				_anim2ActvFl = true;
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('w', 3), 3);
+				_game.syncTimers(3, _globals._animationIndexes[2], 2, 0);
+				break;
+
+			case 3:
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[2]);
+				_scene->sceneScale(467, 95, 442, 78);
+				_anim2ActvFl = false;
+				_game._player._visible = true;
+				_game._player._playerPos = Common::Point(61, 450);
+				_game._player.walk(Common::Point(36, 450), FACING_SOUTHEAST);
+				_game._player.setWalkTrigger(4);
+				break;
+
+			case 4:
+				_game._player._stepEnabled = true;
+				_currentFloor = 1;
+				break;
+
+			default:
+				break;
+			}
+		} else if (_currentFloor == 3) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player.walk(Common::Point(287, 137), FACING_WEST);
+				_game._player.setWalkTrigger(1);
+				break;
+
+			case 1:
+				_game._player.walk(Common::Point(269, 138), FACING_WEST);
+				_game._player.setWalkTrigger(2);
+				break;
+
+			case 2:
+				_anim3ActvFl = true;
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 4), 3);
+				_game.syncTimers(3, _globals._animationIndexes[3], 2, 0);
+				break;
+
+			case 3:
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[3]);
+				_scene->sceneScale(311, 95, 286, 78);
+				_anim3ActvFl = false;
+				_game._player._visible = true;
+				_game._player._playerPos = Common::Point(59, 296);
+				_game._player.walk(Common::Point(40, 294), FACING_SOUTHEAST);
+				_game._player.setWalkTrigger(4);
+				break;
+
+			case 4:
+				_game._player._stepEnabled = true;
+				_currentFloor = 2;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || _game._trigger) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[8], -1, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 4, 75);
+			break;
+
+		case 2:
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+			if (_currentFloor == 3)
+				_game._player.walk(Common::Point(2, 131), FACING_WEST);
+			else if (_currentFloor == 2)
+				_game._player.walk(Common::Point(2, 281), FACING_WEST);
+
+			_scene->_sequences.setTimingTrigger(180, 3);
+			break;
+
+		case 3:
+			if (_currentFloor == 3)
+				_scene->_nextSceneId = 111;
+			else if (_currentFloor == 2)
+				_scene->_nextSceneId = 110;
+			break;
+
+		case 75:
+			_vm->_sound->command(24);
+			if (_currentFloor == 3) {
+				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 3);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0],
+					0, 0, 76);
+			} else if (_currentFloor == 2) {
+				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 3);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1],
+					0, 0, 76);
+			}
+			break;
+
+		case 76:
+			if (_currentFloor == 3) {
+				int idx = _globals._sequenceIndexes[0];
+				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 3);
+				_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			} else if (_currentFloor == 2) {
+				int idx = _globals._sequenceIndexes[1];
+				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 3);
+				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+			}
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10910);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_STAIRCASE)) {
+			if (_currentFloor == 1)
+				_vm->_dialogs->show(10911);
+			else if (_currentFloor == 2)
+				_vm->_dialogs->show(10921);
+			else if (_currentFloor == 3)
+				_vm->_dialogs->show(10922);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_FLOOR)) {
+			_vm->_dialogs->show(10912);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BACKSTAGE)) {
+			_vm->_dialogs->show(10913);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DOOR)) {
+			_vm->_dialogs->show(10914);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_RAILING)) {
+			_vm->_dialogs->show(10915);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(10916);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+			_vm->_dialogs->show(10917);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LAMP)) {
+			_vm->_dialogs->show(10918);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_HOLE)) {
+			_vm->_dialogs->show(10919);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CEILING)) {
+			_vm->_dialogs->show(10920);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_LAMP)) {
+		_vm->_dialogs->show(10924);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) {
+		_vm->_dialogs->show(10923);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene109::preActions() {
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		if (_currentFloor == 3)
+			_game._player.walk(Common::Point(32, 138), FACING_WEST);
+		else if (_currentFloor == 2)
+			_game._player.walk(Common::Point(31, 295), FACING_WEST);
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 99146ae..30e93df 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -257,6 +257,23 @@ public:
 	virtual void actions();
 };
 
+class Scene109 : public Scene1xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _anim3ActvFl;
+	int _currentFloor;
+public:
+	Scene109(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 5a8fbe6..d62e333 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -790,4 +790,8 @@ void Scene::loadSpeech(int idx) {
 void Scene::playSpeech(int idx) {
 	warning("TODO: Scene::playSpeech");
 }
+
+void Scene::sceneScale(int front_y, int front_scale, int back_y,  int back_scale) {
+	warning("TODO: Scene:scaleRoom");
+}
 } // End of namespace MADS
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index 653bdd1..9289593 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -264,6 +264,7 @@ public:
 	void deleteSequence(int idx);
 	void loadSpeech(int idx);
 	void playSpeech(int idx);
+	void sceneScale(int front_y, int front_scale, int back_y,  int back_scale);
 };
 
 } // End of namespace MADS


Commit: 1ce678fddbe4e893c9cf3dd467d8a77ffaeff42d
    https://github.com/scummvm/scummvm/commit/1ce678fddbe4e893c9cf3dd467d8a77ffaeff42d
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-19T14:31:31+02:00

Commit Message:
MADS: Phantom: Implement scene 110

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 5c414d2..4b54a42 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -61,7 +61,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 109:	// upper floor, staircase
 		return new Scene109(vm);
 	case 110:	// outside dressing rooms 1
-		return new DummyScene(vm);	// TODO
+		return new Scene110(vm);
 	case 111:	// outside dressing rooms 2
 		return new DummyScene(vm);	// TODO
 	case 112:	// inside dressing room 1
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index cc84b6e..fb177b5 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -6114,5 +6114,354 @@ void Scene109::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene110::Scene110(MADSEngine *vm) : Scene1xx(vm) {
+}
+
+void Scene110::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+}
+
+void Scene110::setup() {
+	if (_globals[kCurrentYear] == 1993)
+		_scene->_initialVariant = 1;
+
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene110::enter() {
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9", false);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_POSTER, false);
+		_scene->_hotspots.activate(NOUN_WASTE_BASKET, false);
+
+		if (_globals[kDoneBrieConv203] == 0) {
+			if (_globals[kJuliesDoor] == 0) {
+				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
+			}
+		} else {
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+		}
+	} else {
+		_scene->_hotspots.activate(NOUN_BULLETIN_BOARD, false);
+		_scene->_hotspots.activate(NOUN_PAPER, false);
+		_scene->_hotspots.activate(NOUN_TRASH_BUCKET, false);
+	}
+
+	if (_scene->_priorSceneId == 112) {
+		_game._player._playerPos = Common::Point(261, 121);
+		_game._player._facing = FACING_SOUTH;
+		_game._player.walk(Common::Point(221, 131), FACING_SOUTH);
+	} else if ((_scene->_priorSceneId == 109) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player.firstWalk(Common::Point(335, 150), FACING_WEST, Common::Point(310, 150), FACING_WEST, true);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene110::step() {
+}
+
+void Scene110::actions() {
+	if ((_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_RIGHT_DOOR))
+	 && (_globals[kDoneBrieConv203] == 0) && (_globals[kCurrentYear] == 1993) && (_globals[kJuliesDoor] == 0)) {
+		_scene->_nextSceneId = 112;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)
+	 || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_LEFT_DOOR)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled  = false;
+			_game._player._visible = false;  
+			_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 1);
+			break;
+
+		case 1: {
+			int idx = _globals._sequenceIndexes[1];
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4);
+			_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx); 
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
+			_scene->_sequences.setTimingTrigger(30, 2);
+			_vm->_sound->command(73);
+			}
+			break; 
+
+		case 2:
+			_scene->deleteSequence(_globals._sequenceIndexes[1]);
+			_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
+			break;
+
+		case 3:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+			if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
+				_vm->_dialogs->show(32);
+			else
+				_vm->_dialogs->show(11022);
+
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)
+	 || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_RIGHT_DOOR)) {
+		if ((_globals[kCurrentYear] == 1881) || (_globals[kDoneBrieConv203] >= 1)
+		 && !_action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) && !_action.isAction(NOUN_LOCK, NOUN_RIGHT_DOOR)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled  = false;
+				_game._player._visible = false;  
+				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 1);
+				break;
+
+			case 1: {
+				int idx = _globals._sequenceIndexes[1];
+				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4);
+				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx); 
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
+				_scene->_sequences.setTimingTrigger(30, 2);
+				_vm->_sound->command(73);
+				}
+				break; 
+
+			case 2:
+				_scene->deleteSequence(_globals._sequenceIndexes[1]);
+				_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
+				break;
+
+			case 3:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
+					_vm->_dialogs->show(32);
+				else
+					_vm->_dialogs->show(11023);
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		} else if (_globals[kJuliesDoor] == 1) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled  = false;
+				_game._player._visible = false;  
+				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 7, 2);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 4, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
+				break;
+
+			case 1:
+				_vm->_sound->command(24);
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 10, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[2], -1, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
+				break; 
+
+			case 2:
+				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+				break;
+
+			case 3:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+				_game._player._visible = true;
+				_game._player.walk(Common::Point(261, 121), FACING_NORTHEAST);
+				_game._player.setWalkTrigger(4);
+				break;
+
+			case 4:
+				_scene->_nextSceneId = 112;
+				_globals[kJuliesDoor] = 0;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(11010);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_FLOOR)) {
+			_vm->_dialogs->show(11011);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(11012);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CEILING)) {
+			_vm->_dialogs->show(11013);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAIRWELL)) {
+			_vm->_dialogs->show(11014);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_RIGHT_DOOR)) {
+			if (_globals[kDoneBrieConv203] >= 1)
+				_vm->_dialogs->show(11016);
+			else if (_globals[kChrisFStatus] == 1)
+				_vm->_dialogs->show(11015);
+			else
+				_vm->_dialogs->show(11016);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LEFT_DOOR)) {
+			_vm->_dialogs->show(11016);
+			_action._inProgress = false;
+			return;
+		}
+
+		if ((_action.isAction(NOUN_WASTE_BASKET)) || (_action.isAction(NOUN_TRASH_BUCKET))) {
+			_vm->_dialogs->show(11017);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_POSTER)) {
+			_vm->_dialogs->show(11018);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BULLETIN_BOARD)) {
+			_vm->_dialogs->show(11019);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PAPER)) {
+			_vm->_dialogs->show(11029);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(VERB_TAKE, NOUN_WASTE_BASKET) || _action.isAction(VERB_TAKE, NOUN_TRASH_BUCKET)) {
+			_vm->_dialogs->show(11020);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11021);
+			else
+				_vm->_dialogs->show(11028);
+
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_PAPER)) {
+		_vm->_dialogs->show(11030);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_RIGHT_DOOR)) {
+		if (_globals[kDoneBrieConv203] >= 1)
+			_vm->_dialogs->show(11026);
+		else if (_globals[kChrisFStatus] == 1)
+			_vm->_dialogs->show(11024);
+		else
+			_vm->_dialogs->show(11026);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_LEFT_DOOR)) {
+		_vm->_dialogs->show(11025);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) {
+		if ((_globals[kChrisFStatus] == 1) && (_globals[kDoneBrieConv203] == 0))
+			_vm->_dialogs->show(11027);
+
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene110::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_STAIRWELL))
+		_game._player._walkOffScreenSceneId = 109;
+
+	if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_LEFT_DOOR))
+		_game._player.walk(Common::Point(111, 126), FACING_NORTHEAST);
+
+	if (_action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR) || _action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR)
+	 || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_RIGHT_DOOR)) {
+		if ((_globals[kCurrentYear] == 1881) || (_globals[kDoneBrieConv203] >= 1))
+			_game._player.walk(Common::Point(221, 131), FACING_NORTHEAST);
+		else if ((_globals[kJuliesDoor] == 1) || _action.isAction(VERB_OPEN))
+			_game._player.walk(Common::Point(223, 128), FACING_NORTHEAST);
+		else if (_globals[kJuliesDoor] == 0)
+			_game._player.walk(Common::Point(261, 120), FACING_NORTHEAST);
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_PAPER))
+		_game._player._needToWalk = true;
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 30e93df..1a6a6d7 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -274,6 +274,18 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene110 : public Scene1xx {
+public:
+	Scene110(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 8d7872272fefc2a55ad34bbb0f11415e5ed50f37
    https://github.com/scummvm/scummvm/commit/8d7872272fefc2a55ad34bbb0f11415e5ed50f37
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-19T14:34:02+02:00

Commit Message:
MADS: Phantom: Move "lock" to the list of verbs

Changed paths:
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index c0a823a..c51c11e 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -51,6 +51,7 @@ enum Verb {
 	VERB_CLIMB_THROUGH = 0x23,
 	VERB_EXIT_TO = 0x37,
 	VERB_JUMP_INTO = 0x53,
+	VERB_LOCK = 0x5D,
 	VERB_LOOK_AT = 0x60,
 	VERB_LOOK_THROUGH = 0x61,
 	VERB_TURN_OFF = 0x95,
@@ -142,7 +143,6 @@ enum Noun {
 	NOUN_LEG = 0x5A,
 	NOUN_LETTER = 0x5B,
 	NOUN_LIGHT_FIXTURE = 0x5C,
-	NOUN_LOCK = 0x5D,
 	NOUN_LOCKING_RAIL = 0x5E,
 	NOUN_LOCKRAIL = 0x5F,
 	NOUN_MANNEQUINS = 0x62,
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index fb177b5..bd4edd9 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -1364,7 +1364,7 @@ void Scene103::preActions() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_PIT))
 		_game._player._walkOffScreenSceneId = 102;
 
-	if ((_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR)) && (_standPosition == 0))
+	if ((_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) && (_standPosition == 0))
 		_game._player.walk(Common::Point(252, 134), FACING_EAST);
 }
 
@@ -1589,8 +1589,8 @@ void Scene103::actions() {
 		return;
 	}
 
-	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR)) {
-		if ((_globals[kCurrentYear] == 1881) && !_action.isAction(NOUN_LOCK, NOUN_DOOR) && !_action.isAction(VERB_UNLOCK, NOUN_DOOR)) {
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) {
+		if ((_globals[kCurrentYear] == 1881) && !_action.isAction(VERB_LOCK, NOUN_DOOR) && !_action.isAction(VERB_UNLOCK, NOUN_DOOR)) {
 			switch (_game._trigger) {
 			case (0):
 				_game._player._stepEnabled = false;
@@ -1666,7 +1666,7 @@ void Scene103::actions() {
 			case 3:
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
 				_game._player._visible = true;
-				if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
+				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
 					_vm->_dialogs->show(00032);
 				else
 					_vm->_dialogs->show(10335);
@@ -3903,8 +3903,8 @@ void Scene105::actions() {
 	}
 
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || (_game._trigger) ||
-		_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR)) {
-		if ((_globals[kCurrentYear] == 1881) && !_action.isAction(VERB_UNLOCK) && !_action.isAction(NOUN_LOCK)){
+		_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) {
+		if ((_globals[kCurrentYear] == 1881) && !_action.isAction(VERB_UNLOCK) && !_action.isAction(VERB_LOCK)){
 			switch (_game._trigger) {
 			case (0):
 				_game._player._stepEnabled = false;
@@ -3979,7 +3979,7 @@ void Scene105::actions() {
 			case 3:
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]);
 				_game._player._visible = true;
-				if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
+				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
 					_vm->_dialogs->show(32);
 				else
 					_vm->_dialogs->show(10536);
@@ -4166,7 +4166,7 @@ void Scene105::preActions() {
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_PIT))
 		_game._player._walkOffScreenSceneId = 102;
 
-	if (_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(NOUN_LOCK, NOUN_DOOR))
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR))
 		_game._player.walk(Common::Point(33, 128), FACING_NORTHWEST);
 }
 
@@ -6170,7 +6170,7 @@ void Scene110::step() {
 }
 
 void Scene110::actions() {
-	if ((_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_RIGHT_DOOR))
+	if ((_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR))
 	 && (_globals[kDoneBrieConv203] == 0) && (_globals[kCurrentYear] == 1993) && (_globals[kJuliesDoor] == 0)) {
 		_scene->_nextSceneId = 112;
 		_action._inProgress = false;
@@ -6178,7 +6178,7 @@ void Scene110::actions() {
 	}
 
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)
-	 || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_LEFT_DOOR)) {
+	 || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) {
 		switch (_game._trigger) {
 		case (0):
 			_game._player._stepEnabled  = false;
@@ -6211,7 +6211,7 @@ void Scene110::actions() {
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
-			if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
+			if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
 				_vm->_dialogs->show(32);
 			else
 				_vm->_dialogs->show(11022);
@@ -6226,9 +6226,9 @@ void Scene110::actions() {
 	}
 
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)
-	 || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_RIGHT_DOOR)) {
+	 || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) {
 		if ((_globals[kCurrentYear] == 1881) || (_globals[kDoneBrieConv203] >= 1)
-		 && !_action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) && !_action.isAction(NOUN_LOCK, NOUN_RIGHT_DOOR)) {
+		 && !_action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) && !_action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) {
 			switch (_game._trigger) {
 			case (0):
 				_game._player._stepEnabled  = false;
@@ -6261,7 +6261,7 @@ void Scene110::actions() {
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
-				if (_action.isAction(NOUN_LOCK) || _action.isAction(VERB_UNLOCK))
+				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
 					_vm->_dialogs->show(32);
 				else
 					_vm->_dialogs->show(11023);
@@ -6444,11 +6444,11 @@ void Scene110::preActions() {
 	if (_action.isAction(VERB_EXIT_TO, NOUN_STAIRWELL))
 		_game._player._walkOffScreenSceneId = 109;
 
-	if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_LEFT_DOOR))
+	if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR))
 		_game._player.walk(Common::Point(111, 126), FACING_NORTHEAST);
 
 	if (_action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR) || _action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR)
-	 || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(NOUN_LOCK, NOUN_RIGHT_DOOR)) {
+	 || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) {
 		if ((_globals[kCurrentYear] == 1881) || (_globals[kDoneBrieConv203] >= 1))
 			_game._player.walk(Common::Point(221, 131), FACING_NORTHEAST);
 		else if ((_globals[kJuliesDoor] == 1) || _action.isAction(VERB_OPEN))


Commit: 808ef0633979b0044ef047127ddfbfa366f7733d
    https://github.com/scummvm/scummvm/commit/808ef0633979b0044ef047127ddfbfa366f7733d
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-19T21:32:27+02:00

Commit Message:
MADS: Phantom: Implement scene 111. Remove dead 'breaks'.

Changed paths:
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 592a108..d1e6041 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -39,6 +39,7 @@ GamePhantom::GamePhantom(MADSEngine *vm)
 	: Game(vm) {
 	_surface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
 	_storyMode = STORYMODE_NAUGHTY;
+	_difficulty = DIFFICULTY_HARD;
 }
 
 void GamePhantom::startGame() {
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 44b2321..8020d3e 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -35,6 +35,10 @@ namespace Phantom {
 // TODO: Adapt for Phantom's difficulty setting
 enum StoryMode { STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2 };
 
+enum Difficulty {
+	DIFFICULTY_HARD = 1, DIFFICULTY_MEDIUM = 2, DIFFICULTY_EASY = 3
+};
+
 enum InventoryObject {
 	OBJ_NONE = -1,
 	OBJ_KEY = 0,
@@ -79,6 +83,8 @@ protected:
 public:
 	PhantomGlobals _globals;
 	StoryMode _storyMode;
+	Difficulty _difficulty;
+
 
 	virtual Globals &globals() { return _globals; }
 
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 4b54a42..8dd3dc6 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -63,7 +63,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 110:	// outside dressing rooms 1
 		return new Scene110(vm);
 	case 111:	// outside dressing rooms 2
-		return new DummyScene(vm);	// TODO
+		return new Scene111(vm);
 	case 112:	// inside dressing room 1
 		return new DummyScene(vm);	// TODO
 	case 113:	// inside dressing room 2
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index bd4edd9..d0c725b 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -1694,7 +1694,6 @@ void Scene103::actions() {
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
 			_action._inProgress = false;
 			return;
-			break;
 
 		case 1:
 			_scene->deleteSequence(_globals._sequenceIndexes[5]);
@@ -1703,7 +1702,6 @@ void Scene103::actions() {
 			_vm->_sound->command(26);
 			_action._inProgress = false;
 			return;
-			break;
 
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
@@ -1711,7 +1709,6 @@ void Scene103::actions() {
 			_scene->_sequences.setTimingTrigger(20, 3);
 			_action._inProgress = false;
 			return;
-			break;
 
 		case 3:
 			_globals[kPlayerScore] += 5;
@@ -1719,7 +1716,6 @@ void Scene103::actions() {
 			_game._player._stepEnabled = true;
 			_action._inProgress = false;
 			return;
-			break;
 
 		default:
 			break;
@@ -4416,13 +4412,11 @@ void Scene106::actions() {
 		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
 		_action._inProgress = false;
 		return;
-		break;
 
 	case 76:
 		_scene->_nextSceneId = 105;
 		_action._inProgress = false;
 		return;
-		break;
 
 	case 80:
 		_game._player._stepEnabled = false;
@@ -4431,19 +4425,16 @@ void Scene106::actions() {
 		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
 		_action._inProgress = false;
 		return;
-		break;
 
 	case 81:
 		_scene->_sequences.setTimingTrigger(120, 82);
 		_action._inProgress = false;
 		return;
-		break;
 
 	case 82:
 		_scene->_nextSceneId = 301;
 		_action._inProgress = false;
 		return;
-		break;
 
 	default:
 		break;
@@ -6463,5 +6454,549 @@ void Scene110::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene111::Scene111(MADSEngine *vm) : Scene1xx(vm) {
+	_removeAxe = false;
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_closedFl = false;
+	_listenFrame = -1;
+	_listenStatus = -1;
+
+}
+
+void Scene111::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_removeAxe);
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_closedFl);
+	s.syncAsSint16LE(_listenFrame);
+	s.syncAsSint16LE(_listenStatus);
+}
+
+void Scene111::setup() {
+	if (_globals[kCurrentYear] == 1993)
+		_scene->_initialVariant = 1;
+
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene111::enter() {
+	_scene->_hotspots.activate(NOUN_HOOK, false);
+
+	_removeAxe = false;
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_closedFl = true;
+
+	if (_globals[kCurrentYear] == 1881) {
+		if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2) && (_globals[kPanelIn206]) &&
+			(_globals[kDoneRichConv203]) && (_game._objects.isInInventory(OBJ_LANTERN)) &&
+			((_game._objects.isInInventory(OBJ_CABLE_HOOK) && _game._objects.isInInventory(OBJ_ROPE)) || _game._objects.isInInventory(OBJ_ROPE_WITH_HOOK))) {
+				_closedFl = false;
+		} else
+			_closedFl = true;
+	} else
+		_closedFl = false;
+
+	if (_globals[kJacquesStatus]) {
+		_scene->_hotspots.activate(NOUN_HOOK, true);
+		_scene->_hotspots.activate(NOUN_FIRE_AXE, false);
+	}
+
+	_vm->_gameConv->get(14);
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 3), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+
+	if (_globals[kCurrentYear] == 1881)
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 2), false);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_LAMP, false);
+		int idx = _scene->_dynamicHotspots.add(NOUN_WALL, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 82, 35 + 13, 82 + 11));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(78, 122), FACING_NORTHEAST);
+	} else {
+		_scene->_hotspots.activate(NOUN_LIGHT, false);
+		if (_globals[kChristineDoorStatus] == 2) {
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
+			_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
+			_scene->_hotspots.activate(NOUN_FIRE_AXE, false);
+			_scene->_hotspots.activate(NOUN_DOOR_CHUNKS, true);
+			_scene->_hotspots.activate(NOUN_HANDLE, true);
+			_scene->_hotspots.activate(NOUN_AXE, true);
+		}
+	}  
+
+	if ((_globals[kChristineDoorStatus] == 0) && (_scene->_priorSceneId != 113) && !_closedFl) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 3);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+	}
+
+	if ((_globals[kCurrentYear] == 1993) || (_globals[kChristineDoorStatus] <= 1)) {
+		if (!_globals[kJacquesStatus]) {
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 5);
+			_scene->_hotspots.activate(NOUN_AXE, false);
+		}
+		_scene->_hotspots.activate(NOUN_DOOR_CHUNKS, false);
+		_scene->_hotspots.activate(NOUN_HANDLE, false);
+	}
+
+	if (_scene->_priorSceneId == 113) {
+		_game._player._playerPos = Common::Point(146, 108);
+		_game._player.walk(Common::Point(112, 126), FACING_SOUTH);
+
+		if (!_globals[kLeaveAngelMusicOn])
+			sceneEntrySound();
+
+		if (_globals[kChristineDoorStatus] != 2) {
+			_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 3);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+
+			if ((_globals[kCurrentYear] == 1881) && (_globals[kLeaveAngelMusicOn])) {
+				_game._player.setWalkTrigger(60);
+				_game._player._stepEnabled = false;
+				_globals[kChristineDoorStatus] = 1;
+				_globals[kChrisKickedRaoulOut] = true;
+				_globals[kHintThatDaaeIsHome1] = true;
+				_globals[kHintThatDaaeIsHome2] = true;
+			}
+		}
+	} else if ((_scene->_priorSceneId == 109) || (_scene->_priorSceneId != RETURNING_FROM_LOADING))
+		_game._player.firstWalk(Common::Point(335, 150), FACING_WEST, Common::Point(311, 150), FACING_WEST, true);
+
+	sceneEntrySound();
+}
+
+void Scene111::step() {
+	if (_anim0ActvFl)
+		handleListenAnimation ();
+
+	if (!_removeAxe && _anim1ActvFl && (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == 5)) {
+		_scene->deleteSequence(_globals._sequenceIndexes[2]);
+		_game._objects.addToInventory(OBJ_FIRE_AXE);
+		_removeAxe = true;
+	}  
+
+	if (_game._objects.isInInventory(OBJ_FIRE_AXE) && _anim1ActvFl && (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == 36))
+		_game._objects.setRoom(OBJ_FIRE_AXE, NOWHERE);
+
+	if (_game._player._playerPos == Common::Point(145, 108))
+		_scene->_nextSceneId = 113;
+
+	switch (_game._trigger) {
+	case 60:
+		_scene->deleteSequence(_globals._sequenceIndexes[5]);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 7, 1);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 62);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+		_scene->_sequences.setRange(_globals._sequenceIndexes[5], -1, -2);
+		break;
+
+	case 62:
+		_vm->_sound->command(25);
+		_game._player._stepEnabled = true;
+		_vm->_gameConv->run(14);
+		if (_game._difficulty == DIFFICULTY_EASY)
+			_vm->_gameConv->exportValue(1);
+		else
+			_vm->_gameConv->exportValue(0);
+
+		_game._player.walk(Common::Point(119, 124), FACING_EAST);
+		_game._player.setWalkTrigger(64);
+		break;
+
+	case 64:
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 70);
+		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+		_anim0ActvFl = true;
+		_listenStatus = 0;
+		_game._player._visible = false;
+		break;
+
+	case 70:
+		_game._player._visible = true;
+		_anim0ActvFl = false;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_scene->_sequences.setTimingTrigger(30, 71);
+		break;
+
+	case 71:
+		_vm->_gameConv->release();
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene111::actions() {
+	if (_vm->_gameConv->_running == 14) {
+		handleListenConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;  
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
+			_action._inProgress = false;
+			return;
+
+		case 1: {
+			int idx = _globals._sequenceIndexes[0];
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4);
+			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx); 
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
+			_scene->_sequences.setTimingTrigger(30, 2);
+			_vm->_sound->command(73);
+			_action._inProgress = false;
+			return;
+			}
+
+		case 2:
+			_scene->deleteSequence(_globals._sequenceIndexes[0]);
+			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 3);
+			_action._inProgress = false;
+			return;
+
+		case 3:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]); 
+			_game._player._visible = true;
+			if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
+				_vm->_dialogs->show(32);
+			else
+				_vm->_dialogs->show(11123);
+
+			_game._player._stepEnabled = true;
+			_action._inProgress = false;
+			return;
+
+		default:
+			break;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) {
+		if ((_globals[kChristineDoorStatus] == 1) || _closedFl || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;  
+				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
+				_action._inProgress = false;
+				return;
+
+			case 1: {
+				int idx = _globals._sequenceIndexes[0];
+				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4);
+				_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx); 
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
+				_scene->_sequences.setTimingTrigger(30, 2);
+				_vm->_sound->command(73);
+				_action._inProgress = false;
+				return;
+				}
+
+			case 2:
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
+				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 3);
+				_action._inProgress = false;
+				return;
+
+			case 3:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]); 
+				_game._player._visible = true;
+
+				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
+					_vm->_dialogs->show(32);
+				else if ((_globals[kChrisKickedRaoulOut]) && (_globals[kTicketPeoplePresent] == 1) && (_globals[kJacquesStatus] == 0))
+					_vm->_dialogs->show(11135);
+				else
+					_vm->_dialogs->show(11124);
+
+				_game._player._stepEnabled = true;
+				_action._inProgress = false;
+				return;
+
+			default:
+				break;
+			}
+		} else if (_globals[kChristineDoorStatus] == 2) {
+			_vm->_dialogs->show(11137);
+			_action._inProgress = false;
+			return;
+		} else {
+			_vm->_dialogs->show(11126);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_FIRE_AXE)) {
+		if ((_globals[kCurrentYear] == 1881) && (_globals[kJacquesStatus] == 0) && (_globals[kChristineDoorStatus] == 1) && (_globals[kChrisKickedRaoulOut])) {
+			switch (_game._trigger) {
+			case 0:
+				_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('q', -1), 1);
+				_scene->_hotspots.activate(NOUN_FIRE_AXE, false);
+				_scene->_hotspots.activate(NOUN_DOOR_CHUNKS, true);
+				_scene->_hotspots.activate(NOUN_HANDLE, true);
+				_scene->_hotspots.activate(NOUN_AXE, true);
+				_anim1ActvFl = true;
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				break;
+
+			case 1:
+				_globals[kChristineDoorStatus] = 2;
+				_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+				_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[1]); 
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
+				_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]); 
+				_game._player._visible = true;
+				_game._player._playerPos = Common::Point(126, 126);
+				_anim1ActvFl = false;
+				_game._player.walk(Common::Point(145, 108), FACING_NORTHEAST);
+				_game._player.resetFacing(FACING_NORTHWEST);
+				break;
+
+			default:
+				break;
+			}
+		} else if (_globals[kCurrentYear] == 1993 && _globals[kMakeBrieLeave203])
+			_vm->_dialogs->show(11142);
+		else
+			_vm->_dialogs->show(11134);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(11110);
+		else
+			_vm->_dialogs->show(11111);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_FLOOR)) {
+			_vm->_dialogs->show(11112);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(11113);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CEILING)) {
+			_vm->_dialogs->show(11114);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_STAIRWELL)) {
+			_vm->_dialogs->show(11115);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_TABLE)) {
+			_vm->_dialogs->show(11118);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PLANT)) {
+			_vm->_dialogs->show(11119);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_FIRE_AXE)) {
+			_vm->_dialogs->show(11120);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_HANDLE)) {
+			_vm->_dialogs->show(11121);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_AXE)) {
+			_vm->_dialogs->show(11122);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DOOR_CHUNKS)) {
+			_vm->_dialogs->show(11129);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LIGHT)) {
+			_vm->_dialogs->show(11131);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LAMP)) {
+			_vm->_dialogs->show(11132);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_HOOK)) {
+			_vm->_dialogs->show(11141);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LEFT_DOOR)) {
+			if (_globals[kJacquesStatus])
+				_vm->_dialogs->show(11140);
+			else if (_globals[kChristineDoorStatus] == 2)
+				_vm->_dialogs->show(11130);
+			else if ((_globals[kChrisKickedRaoulOut]) && (_globals[kTicketPeoplePresent] == 1))
+				_vm->_dialogs->show(11136);
+			else if ((_globals[kChristineDoorStatus] == 1) || _closedFl)
+				_vm->_dialogs->show(11117);
+			else if (_globals[kChristineDoorStatus] == 0)
+				_vm->_dialogs->show(11116);
+			_action._inProgress = false;
+			return;
+		}  
+
+		if (_action.isAction(NOUN_RIGHT_DOOR)) {
+			_vm->_dialogs->show(11117);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_RIGHT_DOOR)) {
+		_vm->_dialogs->show(11128);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_LEFT_DOOR)) {
+		if (_closedFl)
+			_vm->_dialogs->show(11128);
+		else if ((_globals[kChristineDoorStatus] == 2) && (!_globals[kTicketPeoplePresent]))
+			_vm->_dialogs->show(11138);
+		else if (_globals[kChristineDoorStatus] == 1)
+			_vm->_dialogs->show(11127);
+		else if (_globals[kChristineDoorStatus] == 0)
+			_vm->_dialogs->show(11125);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) {
+		if (_globals[kChristineDoorStatus] == 0)
+			_vm->_dialogs->show(11126);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene111::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_STAIRWELL)) {
+		if (_globals[kLeaveAngelMusicOn]) {
+			_vm->_dialogs->show(11139);
+			_game._player._needToWalk = false;
+			_game._player.cancelCommand();
+		} else
+			_game._player._walkOffScreenSceneId = 109;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_FIRE_AXE) && _game._objects.isInRoom(OBJ_FIRE_AXE) && (_globals[kCurrentYear] == 1881)
+	 && (_globals[kChristineDoorStatus] == 1) && (_globals[kChrisKickedRaoulOut]) && (_globals[kJacquesStatus] == 0))
+		_game._player.walk(Common::Point(119, 124), FACING_EAST);
+
+	if (_action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR))
+		_game._player.walk(Common::Point(219, 131), FACING_NORTHEAST);
+
+	if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR))
+		_game._player.walk(Common::Point(109, 124), FACING_NORTHEAST);
+
+	if ((_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR))
+	 && !_closedFl && ((_globals[kChristineDoorStatus] == 2) || (_globals[kChristineDoorStatus] == 0)))
+		_game._player.walk(Common::Point(145, 108), FACING_NORTHEAST);
+}
+
+void Scene111::handleListenAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _listenFrame)
+		return;
+
+	int nextFrame  = -1;
+	_listenFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+
+	if (_listenFrame == 6) {
+		if (_listenStatus == 0)
+			nextFrame = 5;
+		else if (_listenStatus == 1)
+			nextFrame = 7;
+	}
+
+	if (nextFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], nextFrame);
+		_listenFrame = nextFrame;
+	}
+}
+
+void Scene111::handleListenConversation() {
+	if (_action._activeAction._verbId == 1)
+		_vm->_gameConv->setInterlocutorTrigger(66);
+
+	if (_action._activeAction._verbId == 7)
+		_vm->_gameConv->setInterlocutorTrigger(68);
+
+	if (_game._trigger == 66)
+		_listenStatus = 0;
+
+	if (_game._trigger == 68) {
+		_listenStatus = 1;
+		_vm->_gameConv->hold();
+	}
+
+	if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 7))
+		_vm->_gameConv->setInterlocutorTrigger(72);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 1a6a6d7..b5fb417 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -286,6 +286,29 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene111 : public Scene1xx {
+private:
+	bool _removeAxe;
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _closedFl;
+	int _listenFrame;
+	int _listenStatus;
+
+	void handleListenAnimation();
+	void handleListenConversation();
+
+public:
+	Scene111(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 340016f423f8f8982a70496d9b00aea244d18ce8
    https://github.com/scummvm/scummvm/commit/340016f423f8f8982a70496d9b00aea244d18ce8
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-20T01:04:59+02:00

Commit Message:
MADS: Phantom: Implement scene 112

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 8dd3dc6..29f2223 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -65,7 +65,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 111:	// outside dressing rooms 2
 		return new Scene111(vm);
 	case 112:	// inside dressing room 1
-		return new DummyScene(vm);	// TODO
+		return new Scene112(vm);
 	case 113:	// inside dressing room 2
 		return new DummyScene(vm);	// TODO
 	case 114:	// lower floor, storage room
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index d0c725b..8832942 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -6172,8 +6172,8 @@ void Scene110::actions() {
 	 || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) {
 		switch (_game._trigger) {
 		case (0):
-			_game._player._stepEnabled  = false;
-			_game._player._visible = false;  
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
 			_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
@@ -6183,12 +6183,12 @@ void Scene110::actions() {
 		case 1: {
 			int idx = _globals._sequenceIndexes[1];
 			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4);
-			_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx); 
+			_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
 			_scene->_sequences.setTimingTrigger(30, 2);
 			_vm->_sound->command(73);
 			}
-			break; 
+			break;
 
 		case 2:
 			_scene->deleteSequence(_globals._sequenceIndexes[1]);
@@ -6199,7 +6199,7 @@ void Scene110::actions() {
 			break;
 
 		case 3:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
 			if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
@@ -6222,8 +6222,8 @@ void Scene110::actions() {
 		 && !_action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) && !_action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) {
 			switch (_game._trigger) {
 			case (0):
-				_game._player._stepEnabled  = false;
-				_game._player._visible = false;  
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
@@ -6233,12 +6233,12 @@ void Scene110::actions() {
 			case 1: {
 				int idx = _globals._sequenceIndexes[1];
 				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx); 
+				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
 				_scene->_sequences.setTimingTrigger(30, 2);
 				_vm->_sound->command(73);
 				}
-				break; 
+				break;
 
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[1]);
@@ -6249,7 +6249,7 @@ void Scene110::actions() {
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
@@ -6266,8 +6266,8 @@ void Scene110::actions() {
 		} else if (_globals[kJuliesDoor] == 1) {
 			switch (_game._trigger) {
 			case (0):
-				_game._player._stepEnabled  = false;
-				_game._player._visible = false;  
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
 				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 7, 2);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
@@ -6281,7 +6281,7 @@ void Scene110::actions() {
 				_scene->_sequences.setRange(_globals._sequenceIndexes[2], -1, -2);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
-				break; 
+				break;
 
 			case 2:
 				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3);
@@ -6289,7 +6289,7 @@ void Scene110::actions() {
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 				_game._player._visible = true;
 				_game._player.walk(Common::Point(261, 121), FACING_NORTHEAST);
 				_game._player.setWalkTrigger(4);
@@ -6533,7 +6533,7 @@ void Scene111::enter() {
 			_scene->_hotspots.activate(NOUN_HANDLE, true);
 			_scene->_hotspots.activate(NOUN_AXE, true);
 		}
-	}  
+	}
 
 	if ((_globals[kChristineDoorStatus] == 0) && (_scene->_priorSceneId != 113) && !_closedFl) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 3);
@@ -6584,7 +6584,7 @@ void Scene111::step() {
 		_scene->deleteSequence(_globals._sequenceIndexes[2]);
 		_game._objects.addToInventory(OBJ_FIRE_AXE);
 		_removeAxe = true;
-	}  
+	}
 
 	if (_game._objects.isInInventory(OBJ_FIRE_AXE) && _anim1ActvFl && (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == 36))
 		_game._objects.setRoom(OBJ_FIRE_AXE, NOWHERE);
@@ -6649,7 +6649,7 @@ void Scene111::actions() {
 		switch (_game._trigger) {
 		case (0):
 			_game._player._stepEnabled = false;
-			_game._player._visible = false;  
+			_game._player._visible = false;
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 			_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
@@ -6660,7 +6660,7 @@ void Scene111::actions() {
 		case 1: {
 			int idx = _globals._sequenceIndexes[0];
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4);
-			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx); 
+			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
 			_scene->_sequences.setTimingTrigger(30, 2);
 			_vm->_sound->command(73);
@@ -6678,7 +6678,7 @@ void Scene111::actions() {
 			return;
 
 		case 3:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]); 
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
 			_game._player._visible = true;
 			if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
 				_vm->_dialogs->show(32);
@@ -6699,7 +6699,7 @@ void Scene111::actions() {
 			switch (_game._trigger) {
 			case (0):
 				_game._player._stepEnabled = false;
-				_game._player._visible = false;  
+				_game._player._visible = false;
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
@@ -6710,7 +6710,7 @@ void Scene111::actions() {
 			case 1: {
 				int idx = _globals._sequenceIndexes[0];
 				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx); 
+				_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
 				_scene->_sequences.setTimingTrigger(30, 2);
 				_vm->_sound->command(73);
@@ -6728,7 +6728,7 @@ void Scene111::actions() {
 				return;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]); 
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
 				_game._player._visible = true;
 
 				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
@@ -6773,10 +6773,10 @@ void Scene111::actions() {
 			case 1:
 				_globals[kChristineDoorStatus] = 2;
 				_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
-				_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[1]); 
+				_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[1]);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
 				_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]); 
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
 				_game._player._visible = true;
 				_game._player._playerPos = Common::Point(126, 126);
 				_anim1ActvFl = false;
@@ -6896,7 +6896,7 @@ void Scene111::actions() {
 				_vm->_dialogs->show(11116);
 			_action._inProgress = false;
 			return;
-		}  
+		}
 
 		if (_action.isAction(NOUN_RIGHT_DOOR)) {
 			_vm->_dialogs->show(11117);
@@ -6961,7 +6961,7 @@ void Scene111::handleListenAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _listenFrame)
 		return;
 
-	int nextFrame  = -1;
+	int nextFrame = -1;
 	_listenFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
 
 	if (_listenFrame == 6) {
@@ -6998,5 +6998,657 @@ void Scene111::handleListenConversation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene112::Scene112(MADSEngine *vm) : Scene1xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_raoulAction = -1;
+	_raoulFrame = -1;
+	_didOptionFl = -1;
+	_julieFrame = -1;
+	_julieAction = -1;
+	_julieHotspotId = -1;
+	_julieCounter = -1;
+}
+
+void Scene112::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsSint16LE(_raoulAction);
+	s.syncAsSint16LE(_raoulFrame);
+	s.syncAsSint16LE(_didOptionFl);
+	s.syncAsSint16LE(_julieFrame);
+	s.syncAsSint16LE(_julieAction);
+	s.syncAsSint16LE(_julieCounter);
+}
+
+void Scene112::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_WOMAN);
+	_scene->addActiveVocab(NOUN_JULIE);
+}
+
+void Scene112::enter() {
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_raoulAction = 2;
+		_didOptionFl = 0;
+	}
+
+	_vm->_gameConv->get(3);
+
+	_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('j', 1), 1);
+	_anim0ActvFl = true;
+	_julieAction = 2;
+	_scene->setAnimFrame(_globals._animationIndexes[0], 3);
+	if (_globals[kJulieNameIsKnown] == 2) {
+		_julieHotspotId = _scene->_dynamicHotspots.add(NOUN_JULIE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(255, 82, 255 + 30, 82 + 44));
+		_scene->_dynamicHotspots[_julieHotspotId]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(_julieHotspotId, Common::Point(216, 137), FACING_NORTHEAST);
+		_scene->_hotspots.activate(NOUN_WOMAN, false);
+	}
+	_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1);
+	_anim1ActvFl = true;
+	_scene->setAnimFrame(_globals._animationIndexes[1], 82);
+	_raoulAction = 2;
+
+	if (_vm->_gameConv->_restoreRunning == 3) {
+		_vm->_gameConv->run(3);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_scene->setAnimFrame(_globals._animationIndexes[1], 17);
+		_raoulAction = 1;
+		_game._player._playerPos = Common::Point(53, 128);
+		_game._player._facing = FACING_EAST;
+		_game._player._visible = false;
+	} else if ((_scene->_priorSceneId == 110) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(128, 145);
+		_game._player._facing = FACING_NORTH;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene112::step() {
+	if (_anim0ActvFl)
+		handleJulieAnimation();
+
+	if (_anim1ActvFl)
+		handleRaoulChair();
+}
+
+void Scene112::actions() {
+	if (_vm->_gameConv->_running == 3) {
+		handleConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_TALK_TO, NOUN_JULIE)) || (_action.isAction(VERB_TALK_TO, NOUN_WOMAN))) {
+		if (_globals[kJulieNameIsKnown] > 0) {
+			_game._player._visible = false;
+			_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+			_scene->setAnimFrame(_globals._animationIndexes[1], 1);
+			_raoulAction = 1;
+		}
+		_vm->_gameConv->run(3);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR)) {
+		_scene->_nextSceneId = 110;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(11210);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(11211);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_FLOOR)) {
+			_vm->_dialogs->show(11212);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_MIRROR)) {
+			_vm->_dialogs->show(11213);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_BALLET_BAR)) {
+			_vm->_dialogs->show(11214);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CORRIDOR)) {
+			_vm->_dialogs->show(11215);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_THROW_RUGS)) {
+			_vm->_dialogs->show(11216);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DRESSING_SCREEN)) {
+			_vm->_dialogs->show(11217);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DRESSING_TABLE)) {
+			_vm->_dialogs->show(11218);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CHAIR)) {
+			_vm->_dialogs->show(11219);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PLANT)) {
+			_vm->_dialogs->show(11220);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_COAT_RACK)) {
+			_vm->_dialogs->show(11221);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_UMBRELLA)) {
+			_vm->_dialogs->show(11222);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PAINTINGS)) {
+			_vm->_dialogs->show(11223);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_TRASH_BUCKET)) {
+			_vm->_dialogs->show(11224);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_SHELF)) {
+			_vm->_dialogs->show(11225);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CONTAINER)) {
+			_vm->_dialogs->show(11226);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_TORN_POSTER)) {
+			_vm->_dialogs->show(11227);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_POSTER)) {
+			_vm->_dialogs->show(11228);
+			_action._inProgress = false;
+			return;
+		}
+
+		if ((_action.isAction(NOUN_REVIEW)) || (_action.isAction(NOUN_REVIEWS))) {
+			_vm->_dialogs->show(11229);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_JULIE)) {
+			_vm->_dialogs->show(11231);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_COSTUME_RACK)) {
+			_vm->_dialogs->show(11232);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+			_vm->_dialogs->show(11233);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WARDROBE)) {
+			_vm->_dialogs->show(11234);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WOMAN)) {
+			_vm->_dialogs->show(11237);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE)) {
+		if (_action.isAction(NOUN_WOMAN) || _action.isAction(NOUN_JULIE)) {
+			_vm->_dialogs->show(11238);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_WARDROBE)) {
+		_vm->_dialogs->show(11235);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CONTAINER)) {
+		_vm->_dialogs->show(11236);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene112::preActions() {
+	if ((_action.isAction(VERB_TALK_TO, NOUN_JULIE) || _action.isAction(VERB_TALK_TO, NOUN_WOMAN)) && (_globals[kJulieNameIsKnown] > 0))
+		_game._player.walk(Common::Point(53, 128), FACING_EAST);
+}
+
+void Scene112::handleConversation() {
+	switch (_action._activeAction._verbId) {
+	case 1:
+		if (!_game._trigger && (_raoulAction == 2))
+			_vm->_gameConv->setInterlocutorTrigger(68);
+		break;
+
+	case 3:
+	case 4:
+		if (_globals[kJulieNameIsKnown] < 2) {
+			_globals[kJulieNameIsKnown] = 2;
+			_scene->_hotspots.activate(NOUN_WOMAN, false);
+			_julieHotspotId = _scene->_dynamicHotspots.add(NOUN_JULIE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(255, 82, 255 + 30, 82 + 44));
+			_scene->_dynamicHotspots[_julieHotspotId]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(_julieHotspotId, Common::Point(216, 137), FACING_NORTHEAST);
+		}
+		break;
+
+	case 5:
+		_vm->_gameConv->setInterlocutorTrigger(74);
+		_globals[kJulieNameIsKnown] = 1;
+		break;
+
+	case 6:
+	case 7:
+	case 10:
+	case 23:
+	case 27:
+		_vm->_gameConv->setInterlocutorTrigger(74);
+		_globals[kJulieNameIsKnown] = 2;
+		break;
+
+	case 13:
+		_julieAction = 1;
+		_raoulAction = 1;
+		break;
+
+	case 14:
+	case 15:
+	case 16:
+		_julieAction = 0;
+		_raoulAction = 1;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 60:
+		_julieAction = 0;
+		_raoulAction = 1;
+		break;
+
+	case 62:
+		_julieAction = 2;
+		if (_raoulAction != 2)
+			_raoulAction = 0;
+		break;
+
+	case 68: 
+		_scene->_sequences.setTimingTrigger(120, 70);
+		_vm->_gameConv->hold();
+		break;
+
+	case 70: 
+		_game._player.walk(Common::Point(53, 128), FACING_EAST);
+		_game._player.setWalkTrigger(72);
+		break;
+
+	case 72:
+		_vm->_gameConv->release();
+		_game._player._visible = false;
+		_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+		_scene->setAnimFrame(_globals._animationIndexes[1], 1);
+		_raoulAction = 1;
+		break;
+
+	case 74: 
+		_raoulAction = 3;
+		_vm->_gameConv->hold();
+		break;
+
+	default:
+		break;
+	}
+
+	if ((_action._activeAction._verbId != 0) && (_action._activeAction._verbId != 1) &&
+		(_action._activeAction._verbId != 2) && (_action._activeAction._verbId != 5) &&
+		(_action._activeAction._verbId != 6) && (_action._activeAction._verbId != 7) &&
+		(_action._activeAction._verbId != 10) && (_action._activeAction._verbId != 23) &&
+		(_action._activeAction._verbId != 27)) {
+		_vm->_gameConv->setInterlocutorTrigger(60);
+		_vm->_gameConv->setHeroTrigger(62);
+	}
+
+	if (_action._activeAction._verbId == 18)
+		_globals[kCanFindBookInLibrary] = true;
+
+	_julieCounter = 0;
+}
+
+void Scene112::handleJulieAnimation() {
+	int random = -1;
+	int resetFrame;
+
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _julieFrame) {
+		_julieFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+		resetFrame = -1;
+
+		switch (_julieFrame) {
+		case 1:
+		case 2:
+		case 3:
+		case 22:
+		case 39:
+		case 71:
+		case 107:
+			switch (_julieAction) {
+			case 0:
+				random = _vm->getRandomNumber(4, 6);
+				++_julieCounter;
+				if (_julieCounter > 25)
+					_julieAction = 2;
+				break;
+
+			case 1:
+				random = 3;
+				break;
+
+			case 2:
+				random = _vm->getRandomNumber(1, 3);
+				while (_didOptionFl == random)
+					random = _vm->getRandomNumber(1, 3);
+				_didOptionFl = random;
+				break;
+
+			default:
+				break;
+			}
+
+			switch (random) {
+			case 1:
+				resetFrame = 22;
+				break;
+
+			case 2:
+				resetFrame = 39;
+				break;
+
+			case 3:
+				resetFrame = 83;
+				break;
+
+			case 4:
+				resetFrame = 0;
+				break;
+
+			case 5:
+				resetFrame = 1;
+				break;
+
+			case 6:
+				resetFrame = 2;
+				break;
+
+			default:
+				break;
+			}
+			break;
+		case 56:
+		case 77:
+		case 83:
+			random = _vm->getRandomNumber(1, 3);
+			while (_didOptionFl == random)
+				random = _vm->getRandomNumber(1, 3);
+			_didOptionFl = random;
+
+			if ((_julieAction == 0) || (_julieAction == 1))
+				random = 3;
+
+			switch (random) {
+			case 1:
+				resetFrame = 71;
+				break;
+
+			case 2:
+				resetFrame = 77;
+				break;
+
+			case 3:
+				resetFrame = 56;
+				break;
+
+			default:
+				break;
+			}
+
+			break;
+
+		case 95:
+			if (_julieAction == 1)
+				random = 2;
+			else
+				random = 1;
+
+			switch (random) {
+			case 1:
+				resetFrame = 95;
+				break;
+
+			case 2:
+				resetFrame = 107;
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		case 130:
+			resetFrame = 95;
+			_julieAction = 2;
+			break;
+
+		default:
+			break;
+		}
+
+		if (resetFrame >= 0) {
+			_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+			_julieFrame = resetFrame;
+		}
+	}
+}
+
+void Scene112::handleRaoulChair() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _raoulFrame)
+		return;
+
+	_raoulFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random = -1;
+
+	switch (_raoulFrame) {
+	case 18:
+	case 30:
+	case 41:
+	case 49:
+	case 56:
+	case 65:
+		switch (_raoulAction) {
+		case 0:
+			random = _vm->getRandomNumber(1, 4);
+			_raoulAction = 1;
+			break;
+
+		case 2:
+			random = 6;
+			break;
+
+		case 3:
+			random = 5;
+			_raoulAction = 2;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(7, 50);
+			while (_didOptionFl == random)
+				random = _vm->getRandomNumber(7, 50);
+			_didOptionFl = random;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 49;
+			break;
+
+		case 2:
+			resetFrame = 41;
+			break;
+
+		case 3:
+			resetFrame = 18;
+			break;
+
+		case 4:
+			resetFrame = 30;
+			break;
+
+		case 5:
+			resetFrame = 65;
+			break;
+
+		case 6:
+			resetFrame = 82;
+			break;
+
+		case 7:
+			resetFrame = 56;
+			break;
+
+		default:
+			resetFrame = 17;
+			break;
+		}
+		break;
+
+	case 61:
+		if (_raoulAction == 1)
+			random = 1;
+		else
+			random = 2;
+
+		switch (random) {
+		case 1:
+			resetFrame = 60;
+			break;
+
+		case 2:
+			resetFrame = 61;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 82:
+		_raoulAction = 2;
+		_game._player._visible = true;
+		_vm->_gameConv->release();
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		break;
+
+	case 83:
+		if (_raoulAction == 2)
+			random = 1;
+		else
+			random = 2;
+
+		switch (random) {
+		case 1:
+			resetFrame = 82;
+			break;
+
+		case 2:
+			resetFrame = 0;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_raoulFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index b5fb417..05cf173 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -309,6 +309,35 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene112 : public Scene1xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+
+	int _raoulAction;
+	int _raoulFrame;
+	int _didOptionFl;
+	int _julieFrame;
+	int _julieAction;
+	int _julieCounter;
+	int _julieHotspotId;
+
+	void handleConversation();
+	void handleJulieAnimation();
+	void handleRaoulChair();
+
+public:
+	Scene112(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: e2d86c32489a318327778f3626b2dbe1a1d2a067
    https://github.com/scummvm/scummvm/commit/e2d86c32489a318327778f3626b2dbe1a1d2a067
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-20T14:07:26+02:00

Commit Message:
MADS: Phantom: Implement scene 113, some renaming

Changed paths:
    engines/mads/hotspots.cpp
    engines/mads/hotspots.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/scene.cpp
    engines/mads/scene.h



diff --git a/engines/mads/hotspots.cpp b/engines/mads/hotspots.cpp
index 2235bf5..526654d 100644
--- a/engines/mads/hotspots.cpp
+++ b/engines/mads/hotspots.cpp
@@ -217,4 +217,16 @@ void Hotspots::activate(int vocabId, bool active) {
 	}
 }
 
+void Hotspots::activateAtPos(int vocabId, bool active, Common::Point pos) {
+	for (uint idx = 0; idx < size(); ++idx) {
+		Hotspot &hotspot = (*this)[idx];
+		if ((hotspot._vocabId == vocabId) && (pos.x >= hotspot._bounds.left) &&
+		    (pos.x <= hotspot._bounds.right) && (pos.y >= hotspot._bounds.top) &&
+		    (pos.y <= hotspot._bounds.bottom)) {
+			hotspot._active = active;
+			_vm->_game->_screenObjects.setActive(CAT_HOTSPOT, idx, active);
+		}
+	}
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/hotspots.h b/engines/mads/hotspots.h
index 12b7e99..faabd44 100644
--- a/engines/mads/hotspots.h
+++ b/engines/mads/hotspots.h
@@ -124,6 +124,12 @@ public:
 	 * Sets the active state of a given hotspot
 	 */
 	void activate(int vocabId, bool active);
+
+	/**
+	 * Sets the active state of a given hotspot if it includes a given position
+	 */
+	void activateAtPos(int vocabId, bool active, Common::Point pos);
+
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 29f2223..e961000 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -67,7 +67,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 112:	// inside dressing room 1
 		return new Scene112(vm);
 	case 113:	// inside dressing room 2
-		return new DummyScene(vm);	// TODO
+		return new Scene113(vm);
 	case 114:	// lower floor, storage room
 		return new DummyScene(vm);	// TODO
 	case 150:	// cutscene
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 8832942..2ed2cbf 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -194,6 +194,7 @@ void Scene101::enter() {
 		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_brieAnimId, Common::Point(490, 119), FACING_NONE);
+		// FIXME: 2nd parameter is wrong
 		_scene->setDynamicAnim(_brieAnimId, 0, 0);
 		_scene->setDynamicAnim(_brieAnimId, 0, 1);
 		_scene->setDynamicAnim(_brieAnimId, 0, 2);
@@ -203,6 +204,7 @@ void Scene101::enter() {
 		int tmpIdx = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(25, 80), FACING_NONE);
+		//FIXME: 2nd paramater is wrong
 		_scene->setDynamicAnim(tmpIdx, 1, 1);
 		_scene->setDynamicAnim(tmpIdx, 1, 2);
 
@@ -211,6 +213,7 @@ void Scene101::enter() {
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1);
 		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
+		//FIXME: 2nd parameter is wrong
 		_scene->setDynamicAnim(_brieAnimId, 1, 1);
 		_scene->setDynamicAnim(_brieAnimId, 1, 2);
 		_anim1Running = true;
@@ -419,12 +422,11 @@ void Scene101::handleConversation1() {
 }
 
 void Scene101::handleAnimation0() {
-	int random;
-	int reset_frame;
+	int resetFrame;
 
 	if (_scene->getAnimFrame(_globals._animationIndexes[0]) != _callingFrame) {
 		_callingFrame = _scene->getAnimFrame(_globals._animationIndexes[0]);
-		reset_frame = -1;
+		resetFrame = -1;
 		switch (_callingFrame) {
 		case 1:
 		case 9:
@@ -432,37 +434,36 @@ void Scene101::handleAnimation0() {
 			if (_callingStatus == 1) {
 				if (_callingFrame == 9) {
 					if (_startWalking0Fl) {
-						reset_frame = 13;
+						resetFrame = 13;
 						_callingStatus = 3;
 					} else
 						_callingStatus = 2;
 				} else
-					reset_frame = 1;
+					resetFrame = 1;
 			}
 
 			if (_callingStatus == 0) {
 				if (_startWalking0Fl) {
-					reset_frame = 60;
+					resetFrame = 60;
 					_callingStatus = 3;
 				} else
-					reset_frame = 0;
+					resetFrame = 0;
 			}
 
 			if (_callingStatus == 2) {
 				if (_startWalking0Fl) {
-					reset_frame = 13;
+					resetFrame = 13;
 					_callingStatus = 3;
 				} else {
-					random = _vm->getRandomNumber(1, 2);
 					++_talkCounter;
 
 					if (_talkCounter < 18) {
-						if (random == 1)
-							reset_frame = 7;
+						if (_vm->getRandomNumber(1, 2) == 1)
+							resetFrame = 7;
 						else
-							reset_frame = 10;
+							resetFrame = 10;
 					} else {
-						reset_frame = 54;
+						resetFrame = 54;
 						_callingStatus = 0;
 					}
 				}
@@ -476,37 +477,37 @@ void Scene101::handleAnimation0() {
 
 		case 59:
 			if (_startWalking0Fl) {
-				reset_frame = 60;
+				resetFrame = 60;
 				_callingStatus = 3;
 			} else {
-				reset_frame = 0;
+				resetFrame = 0;
 				_callingStatus = 0;
 			}
 			break;
 
 		case 66:
-			reset_frame = 24;
+			resetFrame = 24;
 			break;
 		}
 
-		if (reset_frame >= 0) {
-			_scene->setAnimFrame(_globals._animationIndexes[0], reset_frame);
-			_callingFrame = reset_frame;
+		if (resetFrame >= 0) {
+			_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+			_callingFrame = resetFrame;
 		}
 	}
 }
 
 void Scene101::handleAnimation1() {
 	int random;
-	int reset_frame;
+	int resetFrame;
 
 	if (_scene->getAnimFrame(_globals._animationIndexes[1]) != _chandelierFrame) {
 		_chandelierFrame = _scene->getAnimFrame(_globals._animationIndexes[1]);
-		reset_frame = -1;
+		resetFrame = -1;
 		switch (_chandelierFrame) {
 		case 1:
 			if (_chandelierStatus == 3)
-				reset_frame = 0;
+				resetFrame = 0;
 			break;
 
 		case 11:
@@ -538,13 +539,13 @@ void Scene101::handleAnimation1() {
 
 			switch (_chandelierStatus) {
 			case 0:
-				reset_frame = 27;
+				resetFrame = 27;
 				_chandelierStatus = 2;
 				break;
 
 			case 1:
 				_globals[kBrieTalkStatus] = 2;
-				reset_frame = 45;
+				resetFrame = 45;
 				if (_vm->_gameConv->_running == 1)
 					_vm->_gameConv->stop();
 				_scene->_dynamicHotspots.remove(_brieAnimId);
@@ -556,28 +557,28 @@ void Scene101::handleAnimation1() {
 				++_talkCounter;
 				if (_talkCounter < 15) {
 					if (random == 1)
-						reset_frame = 12;
+						resetFrame = 12;
 					else if (random == 2)
-						reset_frame = 14;
+						resetFrame = 14;
 					else if (random == 3)
-						reset_frame = 17;
+						resetFrame = 17;
 				} else {
 					_chandelierStatus = 4;
-					reset_frame = 25;
+					resetFrame = 25;
 				}
 				break;
 
 			case 4:
-				reset_frame = 25;
+				resetFrame = 25;
 				break;
 
 			case 5:
-				reset_frame = 21;
+				resetFrame = 21;
 				_chandelierStatus = 2;
 				break;
 
 			case 6:
-				reset_frame = 316;
+				resetFrame = 316;
 				_chandelierStatus = 2;
 				break;
 
@@ -591,9 +592,9 @@ void Scene101::handleAnimation1() {
 			break;
 		}
 
-		if (reset_frame >= 0) {
-			_scene->setAnimFrame(_globals._animationIndexes[1], reset_frame);
-			_chandelierFrame = reset_frame;
+		if (resetFrame >= 0) {
+			_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+			_chandelierFrame = resetFrame;
 		}
 	}
 }
@@ -782,6 +783,7 @@ void Scene102::actions() {
 }
 
 /*------------------------------------------------------------------------*/
+
 Scene103::Scene103(MADSEngine *vm) : Scene1xx(vm) {
 	_jacquesAction = -1;
 	_lastRandom = -1;
@@ -2246,10 +2248,10 @@ void Scene103::climbRightStairs() {
 		return;
 
 	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[3]);
-	int stairs_reset_frame = -1;
+	int stairsResetFrame = -1;
 
 	if (_lastStairFrame == 37) {
-		stairs_reset_frame = 36;
+		stairsResetFrame = 36;
 		_standPosition = 2;
 		_game._player._stepEnabled = true;
 	}
@@ -2261,9 +2263,9 @@ void Scene103::climbRightStairs() {
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
 	}
 
-	if (stairs_reset_frame >= 0) {
-		_scene->setAnimFrame(_globals._animationIndexes[3], stairs_reset_frame);
-		_lastStairFrame = stairs_reset_frame;
+	if (stairsResetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[3], stairsResetFrame);
+		_lastStairFrame = stairsResetFrame;
 	}
 }
 
@@ -2272,10 +2274,10 @@ void Scene103::climbLeftStairs() {
 		return;
 
 	_lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[5]);
-	int stairs_reset_frame = -1;
+	int stairsResetFrame = -1;
 
 	if (_lastStairFrame == 34) {
-		stairs_reset_frame = 33;
+		stairsResetFrame = 33;
 		_standPosition = 1;
 		_game._player._stepEnabled = true;
 	}
@@ -2287,9 +2289,9 @@ void Scene103::climbLeftStairs() {
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
 	}
 
-	if (stairs_reset_frame >= 0) {
-		_scene->setAnimFrame(_globals._animationIndexes[5], stairs_reset_frame);
-		_lastStairFrame = stairs_reset_frame;
+	if (stairsResetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[5], stairsResetFrame);
+		_lastStairFrame = stairsResetFrame;
 	}
 }
 
@@ -2322,8 +2324,7 @@ void Scene103::descendLeftStairs() {
 }
 
 void Scene103::process_conv_jacques() {
-	int quit_converse = false;
-	int *value_1;
+	int quitConversationFl = false;
 
 	switch (_action._activeAction._verbId) {
 	case 1:
@@ -2342,13 +2343,14 @@ void Scene103::process_conv_jacques() {
 	case 7:
 	case 10:
 	case 19:
-	case 30:
+	case 30: {
 		_globals[kWalkerConverse] = 0;
-		value_1 = _vm->_gameConv->getVariable(26);
-		if (*value_1)
+		int *val = _vm->_gameConv->getVariable(26);
+		if (*val)
 			_globals[kJacquesNameIsKnown] = 2;
 
-		quit_converse = true;
+		quitConversationFl = true;
+		}
 		break;
 
 	case 8:
@@ -2375,32 +2377,32 @@ void Scene103::process_conv_jacques() {
 
 	switch (_game._trigger) {
 	case 90:
-		if (!quit_converse)
+		if (!quitConversationFl)
 			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
 		_jacquesAction = 0;
 		break;
 
 	case 92:
-		if (!quit_converse)
+		if (!quitConversationFl)
 			_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
 		_convCount = 0;
 		_jacquesAction = 1;
 		break;
 
 	case 94:
-		if (!quit_converse)
+		if (!quitConversationFl)
 			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
 		_jacquesAction = 2;
 		break;
 
 	case 96:
-		if (!quit_converse)
+		if (!quitConversationFl)
 			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
 		_jacquesAction = 3;
 		break;
 
 	case 98:
-		if (!quit_converse)
+		if (!quitConversationFl)
 			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
 		_jacquesAction = 4;
 		break;
@@ -2537,7 +2539,7 @@ void Scene104::enter() {
 		_anim0ActvFl = true;
 		_richStatus = 0;
 
-		cleanInventory ();
+		cleanInventory();
 
 		_game._player._visible = false;
 		_game._visitedScenes.pop_back();
@@ -3101,30 +3103,30 @@ void Scene104::handleWalkAnimation() {
 		return;
 
 	_walkFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
-	int daae_walk_reset_frame = -1;
+	int daaeResetFrame = -1;
 
 	switch (_walkFrame) {
 	case 1:
 		if (_walkStatus == 0) {
-			daae_walk_reset_frame = 0;
+			daaeResetFrame = 0;
 		} else {
 			_game.syncTimers(3, _globals._animationIndexes[2], 3, _globals._animationIndexes[1]);
-			daae_walk_reset_frame = 1;
+			daaeResetFrame = 1;
 		}
 		break;
 
 	case 138:
 		_walkStatus = 0;
-		daae_walk_reset_frame = 0;
+		daaeResetFrame = 0;
 		break;
 
 	default:
 		break;
 	}
 
-	if (daae_walk_reset_frame >= 0) {
-		_scene->setAnimFrame(_globals._animationIndexes[2], daae_walk_reset_frame);
-		_walkFrame = daae_walk_reset_frame;
+	if (daaeResetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], daaeResetFrame);
+		_walkFrame = daaeResetFrame;
 	}
 }
 
@@ -4223,7 +4225,7 @@ void Scene106::enter() {
 		_sandbagHostpotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(227, 140, 227 + 18, 140 + 11));
 		_scene->_dynamicHotspots.setPosition(_sandbagHostpotId, Common::Point(224, 152), FACING_NORTHEAST);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
-	} 
+	}
 
 	if (_globals[kCurrentYear] == 1881) {
 		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
@@ -4360,7 +4362,7 @@ void Scene106::actions() {
 			}
 			_action._inProgress = false;
 			return;
-		} 
+		}
 	}
 
 	if (_action.isAction(VERB_TAKE, NOUN_CABLE_HOOK)) {
@@ -4401,7 +4403,7 @@ void Scene106::actions() {
 			}
 			_action._inProgress = false;
 			return;
-		} 
+		}
 	}
 
 	switch (_game._trigger) {
@@ -5039,7 +5041,7 @@ void Scene108::synchronize(Common::Serializer &s) {
 void Scene108::setup() {
 	setPlayerSpritesPrefix();
 	setAAName();
-	
+
 	if (_globals[kCurrentYear] == 1993)
 		_scene->_initialVariant = 1;
 
@@ -5097,7 +5099,7 @@ void Scene108::enter() {
 			_scene->_dynamicHotspots[_charHotspotId]._articleNumber = PREP_ON;
 		}
 		_scene->_dynamicHotspots.setPosition(_charHotspotId, Common::Point(235, 102), FACING_NORTHEAST);
-	} 
+	}
 
 	if (_scene->_priorSceneId == 106) {
 		_game._player._playerPos = Common::Point(48, 81);
@@ -5123,7 +5125,7 @@ void Scene108::enter() {
 
 void Scene108::step() {
 	if (_anim0ActvFl)
-		handleCharAnimation ();
+		handleCharAnimation();
 
 	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
 		++_conversationCount;
@@ -5162,7 +5164,7 @@ void Scene108::actions() {
 		_vm->_dialogs->show(10810);
 		_action._inProgress = false;
 		return;
-	} 
+	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
 		if (_action.isAction(NOUN_WALL)) {
@@ -5382,7 +5384,7 @@ void Scene108::handleCharAnimation() {
 				_shutUpCount = 0;
 				_prevShutUpFrame = 10;
 				random = 12;
-			} 
+			}
 		} else if (_charAction == 0) {
 			int delay = _vm->getRandomNumber(10, 15);
 			++_shutUpCount;
@@ -5581,7 +5583,7 @@ void Scene108::handleCharlesConversation() {
 
 	default:
 		break;
-	} 
+	}
 
 	if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 5) &&
 		(_action._activeAction._verbId != 16) && (_action._activeAction._verbId != 19) &&
@@ -6578,7 +6580,7 @@ void Scene111::enter() {
 
 void Scene111::step() {
 	if (_anim0ActvFl)
-		handleListenAnimation ();
+		handleListenAnimation();
 
 	if (!_removeAxe && _anim1ActvFl && (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == 5)) {
 		_scene->deleteSequence(_globals._sequenceIndexes[2]);
@@ -7342,12 +7344,12 @@ void Scene112::handleConversation() {
 			_raoulAction = 0;
 		break;
 
-	case 68: 
+	case 68:
 		_scene->_sequences.setTimingTrigger(120, 70);
 		_vm->_gameConv->hold();
 		break;
 
-	case 70: 
+	case 70:
 		_game._player.walk(Common::Point(53, 128), FACING_EAST);
 		_game._player.setWalkTrigger(72);
 		break;
@@ -7360,7 +7362,7 @@ void Scene112::handleConversation() {
 		_raoulAction = 1;
 		break;
 
-	case 74: 
+	case 74:
 		_raoulAction = 3;
 		_vm->_gameConv->hold();
 		break;
@@ -7650,5 +7652,1501 @@ void Scene112::handleRaoulChair() {
 
 /*------------------------------------------------------------------------*/
 
+Scene113::Scene113(MADSEngine *vm) : Scene1xx(vm) {
+	_standing_talking = false;
+	_day_wants_to_talk = false;
+	_music_is_playing = false;
+	_right_after_kiss = false;
+	_anim_0_running = false;
+	_anim_1_running = false;
+	_anim_2_running = false;
+	_anim_3_running = false;
+	_anim_4_running = false;
+	_prevent_1 = false;
+	_prevent_2 = false;
+	_raoul_is_up = false;
+	_arms_are_out = false;
+
+	_dayStatus = -1;
+	_raoulAction = -1;
+	_christineHotspotId2 = -1;
+	_raoulCount = -1;
+	_dayCount = -1;
+	_standCount = -1;
+	_julieStatus = -1;
+	_florentStatus = -1;
+	_florentFrame = -1;
+	_florentCount = -1;
+	_dayFrame = -1;
+	_lastDayResetFrame = -1;
+	_raoulFrame = -1;
+	_julieFrame = -1;
+	_julieCount = -1;
+}
+
+void Scene113::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_standing_talking);
+	s.syncAsByte(_day_wants_to_talk);
+	s.syncAsByte(_music_is_playing);
+	s.syncAsByte(_right_after_kiss);
+	s.syncAsByte(_anim_0_running);
+	s.syncAsByte(_anim_1_running);
+	s.syncAsByte(_anim_2_running);
+	s.syncAsByte(_anim_3_running);
+	s.syncAsByte(_anim_4_running);
+	s.syncAsByte(_prevent_1);
+	s.syncAsByte(_prevent_2);
+	s.syncAsByte(_raoul_is_up);
+	s.syncAsByte(_arms_are_out);
+
+	s.syncAsSint16LE(_dayStatus);
+	s.syncAsSint16LE(_raoulAction);
+	s.syncAsSint16LE(_christineHotspotId2);
+	s.syncAsSint16LE(_raoulCount);
+	s.syncAsSint16LE(_dayCount);
+	s.syncAsSint16LE(_standCount);
+	s.syncAsSint16LE(_julieStatus);
+	s.syncAsSint16LE(_florentStatus);
+	s.syncAsSint16LE(_florentFrame);
+	s.syncAsSint16LE(_florentCount);
+	s.syncAsSint16LE(_dayFrame);
+	s.syncAsSint16LE(_lastDayResetFrame);
+	s.syncAsSint16LE(_raoulFrame);
+	s.syncAsSint16LE(_julieFrame);
+	s.syncAsSint16LE(_julieCount);
+}
+
+void Scene113::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_CHRISTINE);
+	_scene->addActiveVocab(NOUN_WOMAN);
+	_scene->addActiveVocab(NOUN_JULIE);
+}
+
+void Scene113::enter() {
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_standing_talking = false;
+		_day_wants_to_talk = false;
+		_music_is_playing = false;
+		_right_after_kiss = false;
+		_anim_0_running = false;
+		_anim_1_running = false;
+		_anim_2_running = false;
+		_anim_3_running = false;
+		_anim_4_running = false;
+		_prevent_1 = false;
+		_prevent_2 = false;
+		_raoul_is_up = false;
+		_arms_are_out = false;
+	}
+
+	_scene->_hotspots.activate(NOUN_SMALL_NOTE, false);
+	_scene->_hotspots.activate(NOUN_DRESSING_GOWN, false);
+	_scene->_hotspots.activate(NOUN_CHRISTINE, false);
+	_scene->_hotspots.activate(NOUN_JULIE, false);
+	_scene->_hotspots.activate(NOUN_LIGHT_FIXTURE, false);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+
+		if (_game._objects.isInRoom(OBJ_SMALL_NOTE))
+			_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+
+		if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3))
+			_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 3), false);
+	}
+
+	if (_globals[kCurrentYear] == 1993) {
+		_vm->_gameConv->get(4);
+		if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3))
+			_vm->_gameConv->get(6);
+	} else {
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*faceral", false);
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*facecrsd", false);
+		_vm->_gameConv->get(13);
+	}
+
+	if (_globals[kCurrentYear] == 1993) {
+		_scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_VASE, false);
+		_scene->_hotspots.activate(NOUN_FAN, false);
+		_scene->_hotspots.activateAtPos(NOUN_LIGHT_FIXTURE, true, Common::Point(155, 17));
+	} else {
+		_scene->_hotspots.activateAtPos(NOUN_LIGHT_FIXTURE, true, Common::Point(150, 46));
+		_scene->_hotspots.activate(NOUN_NOTICE, false);
+	}
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		if (_globals[kCurrentYear] == 1881) {
+			if (_dayStatus <= 3) {
+				_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1);
+				_anim_1_running = true;
+			}
+
+			if (_raoulAction == 3)
+				_scene->setAnimFrame(_globals._animationIndexes[1], 33);
+			else {
+				_raoulAction = 1;
+				_game._player._visible = false;
+				_scene->setAnimFrame(_globals._animationIndexes[1], 8);
+			}
+
+			if (_music_is_playing) {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0);
+				_anim_0_running = true;
+				_christineHotspotId1 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+				_scene->_dynamicHotspots[_christineHotspotId1]._articleNumber = PREP_ON;
+				_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 13);
+				_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 14);
+				_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 16);
+				_scene->setAnimFrame(_globals._animationIndexes[0], 212);
+				_game._player._visible = true;
+				_anim_1_running = false;
+			} else {
+				switch (_dayStatus) {
+				case 0:
+				case 1:
+				case 2:
+				case 3:
+					_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 0);
+					_anim_0_running = true;
+					_dayStatus = 2;
+					_scene->setAnimFrame(_globals._animationIndexes[0], 208);
+					_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+					_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(220, 130));
+					break;
+
+				default:
+					_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0);
+					_anim_0_running = true;
+					_dayStatus = 7;
+					_game._player._visible = false;
+					_scene->setAnimFrame(_globals._animationIndexes[0], 165);
+					break;
+				}
+				_christineHotspotId1 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+				_scene->_dynamicHotspots[_christineHotspotId1]._articleNumber = PREP_ON;
+				_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 13);
+				_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 14);
+				_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 16);
+			}
+
+			if (_dayStatus == 2) {
+				_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+				_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(220, 130));
+			} else {
+				_game._player._playerPos = Common::Point(175, 148);
+				_game._player._facing = FACING_NORTHEAST;
+			}
+
+		} else if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3)) {
+			_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('x', 1), 1);
+			_julieStatus = 0;
+			_anim_4_running = true;
+			_globals[kMakeBrieLeave203] = true;
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+			_scene->_hotspots.activate(NOUN_DRESSING_GOWN, true);
+			_scene->_hotspots.activate(NOUN_JULIE, true);
+			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(220, 130));
+		} else if (_globals[kCurrentYear] == 1993) {
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('f', 1), 1);
+			_anim_2_running = true;
+
+			if (_florentStatus != 3)
+				_florentStatus = 1;
+
+			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('r', 1), 1);
+			_anim_3_running = true;
+
+			if (_raoulAction == 3)
+				_scene->setAnimFrame(_globals._animationIndexes[3], 33);
+			else {
+				_scene->setAnimFrame(_globals._animationIndexes[3], 8);
+				_raoulAction = 1;
+				_game._player._playerPos = Common::Point(201, 120);
+				_game._player._facing = FACING_SOUTH;
+				_game._player._visible = false;
+			}
+
+			if (_florentStatus == 3)
+				_scene->setAnimFrame(_globals._animationIndexes[2], 41);
+
+			if (_globals[kFlorentNameIsKnown] >= 1) {
+				_christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29));
+				_scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON;
+				_scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST);
+			} else {
+				_christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_WOMAN, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29));
+				_scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON;
+				_scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST);
+			}
+
+			_scene->_hotspots.activate(NOUN_DRESSING_GOWN, true);
+
+			if (_game._objects.isInRoom(OBJ_SMALL_NOTE)) {
+				_scene->_hotspots.activate(NOUN_SMALL_NOTE, true);
+				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
+			}
+		}
+	} else if (_globals[kCurrentYear] == 1993) {
+		if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3)) {
+			if (!(_globals[kPlayerScoreFlags] & 4)) {
+				_globals[kPlayerScoreFlags] = _globals[kPlayerScoreFlags] | 4;
+				_globals[kPlayerScore] += 5;
+			}
+
+			_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('x', 1), 1);
+			_julieStatus = 0;
+			_anim_4_running = true;
+			_globals[kMakeBrieLeave203] = true;
+			_game._player._playerPos = Common::Point(190, 148);
+			_game._player._facing = FACING_NORTH;
+			_game._player._stepEnabled = false;
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+			_scene->_hotspots.activate(NOUN_DRESSING_GOWN, true);
+			_scene->_hotspots.activate(NOUN_JULIE, true);
+			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(220, 130));
+			_game._player.walk(Common::Point(175, 128), FACING_NORTHEAST);
+			_game._player.setWalkTrigger(102);
+		} else {
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+
+			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('f', 1), 1);
+			_florentStatus = 1;
+			_anim_2_running = true;
+
+			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('r', 1), 1);
+			_raoulAction = 3;
+			_anim_3_running = true;
+			_scene->setAnimFrame(_globals._animationIndexes[3], 33);
+
+			if (_globals[kFlorentNameIsKnown] >= 1) {
+				_christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29));
+				_scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON;
+				_scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST);
+			} else {
+				_christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_WOMAN, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29));
+				_scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON;
+				_scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST);
+			}
+
+			_game._player._playerPos = Common::Point(190, 148);
+			_game._player._facing = FACING_NORTH;
+
+			_scene->_hotspots.activate(NOUN_DRESSING_GOWN, true);
+			if (_game._objects.isInRoom(OBJ_SMALL_NOTE)) {
+				_scene->_hotspots.activate(NOUN_SMALL_NOTE, true);
+				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
+			}
+		}
+	} else if ((_globals[kCurrentYear] == 1881) && (! _globals[kChrisKickedRaoulOut])) {
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1);
+		_raoulAction = 3;
+		_anim_1_running = true;
+		_scene->setAnimFrame(_globals._animationIndexes[1], 33);
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1);
+		_dayStatus = 2;
+		_anim_0_running = true;
+
+		_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+		_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(220, 130));
+		_scene->_sequences.setTimingTrigger(60, 60);
+		_game._player._playerPos = Common::Point(190, 148);
+		_game._player._facing = FACING_NORTH;
+	} else if ((_globals[kCurrentYear] == 1881) && _globals[kChrisKickedRaoulOut]) {
+		_globals[kChrisKickedRaoulOut] = 2;
+		_game._player._playerPos = Common::Point(190, 148);
+		_game._player._facing = FACING_NORTH;
+		_globals[kCameFromFade] = true;
+		_game._player._stepEnabled = false;
+		_globals[kPlayerScore] += 8;
+		_scene->_sequences.setTimingTrigger(60, 110);
+	} else if (_scene->_priorSceneId == 111) {
+		_game._player._playerPos = Common::Point(190, 148);
+		_game._player._facing = FACING_NORTH;
+	}
+
+	switch (_vm->_gameConv->_restoreRunning) {
+	case 4:
+		_vm->_gameConv->run(4);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		break;
+
+	case 6:
+		_vm->_gameConv->run(6);
+		break;
+
+	case 13:
+		_vm->_gameConv->run(13);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		break;
+
+	default:
+		break;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene113::step() {
+	if (_anim_1_running)
+		handle_animation_13_raoul();
+
+	if (_anim_4_running)
+		handle_animation_6_julie();
+
+	if (_anim_2_running)
+		handle_animation_florent();
+
+	if (_anim_3_running) {
+		handle_animation_4_raoul();
+
+		if ((!_game._objects.isInInventory(OBJ_SMALL_NOTE)) && (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 26)) {
+			_scene->_hotspots.activate(NOUN_SMALL_NOTE, false);
+			_game._objects.addToInventory(OBJ_SMALL_NOTE);
+			_scene->deleteSequence(_globals._sequenceIndexes[1]);
+			_vm->_sound->command(26);
+			_scene->_speechReady = -1;
+			_vm->_dialogs->showItem(OBJ_SMALL_NOTE, 806, 2);
+		}
+	}
+
+	if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 86) && (!_prevent_2)) {
+		_scene->freeAnimation(_globals._animationIndexes[0]);
+		_prevent_2 = true;
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0);
+		_scene->setAnimFrame (_globals._animationIndexes[0], 86);
+		_game.syncTimers(3, _globals._animationIndexes[0], 4, 0);
+		_scene->animations_tick();
+	}
+
+	if (_anim_0_running) {
+		handle_animation_13_day();
+
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 95) && (!_arms_are_out)) {
+			_standing_talking = true;
+			_dayStatus = 7;
+			_raoulAction = 3;
+			_arms_are_out = true;
+			_game.syncTimers(3, _globals._animationIndexes[0], 3, _globals._animationIndexes[1]);
+		}
+
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 165) && !_right_after_kiss)
+			_right_after_kiss = true;
+	}
+
+	switch (_game._trigger) {
+	case 60:
+		if (!_game._visitedScenes._sceneRevisited)
+			_vm->_dialogs->show(11342);
+		break;
+
+	case 102:
+		_game._player._stepEnabled = true;
+		_vm->_gameConv->run(6);
+		break;
+
+	case 108:
+		_vm->_dialogs->show(11332);
+		_vm->_dialogs->show(11333);
+		_scene->_nextSceneId = 150;
+		_globals[kLeaveAngelMusicOn] = false;
+		break;
+
+	case 110:
+		_vm->_dialogs->show(11331);
+		_game._player.walk(Common::Point(272, 138), FACING_EAST);
+		_game._player.setWalkTrigger(108);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene113::actions() {
+	if (_vm->_gameConv->_running == 13) {
+		process_conversation_love();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 4) {
+		process_conversation_florent();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 6) {
+		process_conversation_dead();
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_TALK_TO, NOUN_WOMAN)) || (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE))) {
+		if (_globals[kCurrentYear] == 1881) {
+			_game._player._stepEnabled = true;
+			_vm->_gameConv->run(13);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		} else if (_globals[kDoneBrieConv203]) {
+			_vm->_dialogs->show(11348);
+		} else {
+			_game._player._stepEnabled = true;
+			_vm->_gameConv->run(4);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR)) {
+		if (_globals[kDoneBrieConv203] == 1)
+			_globals[kDoneBrieConv203] = 3;
+
+		_scene->_nextSceneId = 111;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		if (_globals[kCurrentYear] == 1993) {
+			if (_globals[kDoneBrieConv203])
+				_vm->_dialogs->show(11340);
+			else
+				_vm->_dialogs->show(11310);
+		} else {
+			_vm->_dialogs->show(11311);
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isAction(NOUN_FLOOR)) {
+			_vm->_dialogs->show(11312);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_RUG)) {
+			_vm->_dialogs->show(11313);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WALL)) {
+			_vm->_dialogs->show(11314);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_COUCH)) {
+			_vm->_dialogs->show(11315);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_MURAL)) {
+			_vm->_dialogs->show(11316);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PAINTING)) {
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->show(11317);
+			else
+				_vm->_dialogs->show(11343);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_PAINTING)) {
+			_vm->_dialogs->show(11317);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DRESSING_TABLE)) {
+			_vm->_dialogs->show(11318);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CHAIR)) {
+			_vm->_dialogs->show(11319);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_MIRROR)) {
+			if (_globals[kCurrentYear] == 1993) {
+				_vm->_dialogs->show(11344);
+			} else {
+				_vm->_dialogs->show(11320);
+			}
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_FAN)) {
+			_vm->_dialogs->show(11321);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_VASE)) {
+			_vm->_dialogs->show(11322);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_HAT_RACK)) {
+			_vm->_dialogs->show(11323);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+			_vm->_dialogs->show(11324);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CEILING)) {
+			_vm->_dialogs->show(11325);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WARDROBE)) {
+			_vm->_dialogs->show(11326);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DRESSING_SCREEN)) {
+			_vm->_dialogs->show(11327);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CORRIDOR)) {
+			_vm->_dialogs->show(11328);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_DRESSING_GOWN)) {
+			_vm->_dialogs->show(11330);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_SMALL_NOTE) && _game._objects.isInRoom(OBJ_SMALL_NOTE)) {
+			_vm->_dialogs->show(11349);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CHRISTINE) && _globals[kDoneBrieConv203]) {
+			_vm->_dialogs->show(11338);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_JULIE)) {
+			_vm->_dialogs->show(11339);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_NOTICE)) {
+			_vm->_dialogs->show(11347);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_CLOTHES_DUMMY)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11345);
+			else
+				_vm->_dialogs->show(11346);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isAction(NOUN_WOMAN) || _action.isAction(NOUN_CHRISTINE)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11341);
+			else {
+				if (_music_is_playing)
+					_vm->_dialogs->show(11336);
+				else
+					_vm->_dialogs->show(11342);
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_WARDROBE)) {
+		_vm->_dialogs->show(11329);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_SMALL_NOTE) && _game._objects.isInRoom(OBJ_SMALL_NOTE)) {
+		_vm->_dialogs->show(11334);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_DRESSING_GOWN)) {
+		_vm->_dialogs->show(11335);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE) || _action.isAction(VERB_TAKE, NOUN_WOMAN)) {
+		_vm->_dialogs->show(11337);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene113::preActions() {
+	if (_action.isAction(VERB_WALK_UP, NOUN_AISLE))
+		_game._player._walkOffScreenSceneId = 101;
+
+	if (_action.isAction(VERB_LOOK, NOUN_MIRROR))
+		_game._player.walk(Common::Point(272, 138), FACING_EAST);
+
+	if (! _action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR) && !_globals[kChrisKickedRaoulOut]
+	 && !_action.isAction(VERB_LOOK, NOUN_CHRISTINE) && !_action.isAction(VERB_TAKE, NOUN_CHRISTINE) && _music_is_playing) {
+		_vm->_gameConv->run(13);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_game._player.cancelCommand();
+	} else if (_action.isAction(VERB_TALK_TO, NOUN_WOMAN) || _action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) {
+		_game._player.walk(Common::Point(106, 127), FACING_SOUTHWEST);
+	}
+
+	if (!_action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR) && !_action.isAction(VERB_LOOK, NOUN_JULIE)
+	 && !_action.isAction(VERB_LOOK, NOUN_CHRISTINE) && !_action._lookFlag && (_globals[kDoneBrieConv203] != 0)
+	 && (_globals[kCurrentYear] == 1993)) {
+		if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) {
+			_game._player._needToWalk = false;
+
+		} else if (_action.isAction(VERB_LOOK)) {
+			_game._player._needToWalk = false;
+
+		} else if (_action.isAction(VERB_TALK_TO, NOUN_JULIE)) {
+			_game._player._needToWalk = false;
+			_vm->_gameConv->run(6);
+			_game._player.cancelCommand();
+
+		} else {
+			_vm->_dialogs->show(11350);
+			_game._player._needToWalk = false;
+			_game._player.cancelCommand();
+		}
+	}
+}
+
+void Scene113::handle_animation_florent() {
+	if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _florentFrame)
+		return;
+
+	int random;
+	_florentFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_florentFrame) {
+	case 1:
+	case 11:
+	case 23:
+	case 38:
+	case 45:
+		random = _vm->getRandomNumber(4, 30);
+
+		if (_florentStatus == 2) {
+			random = 1;
+		}
+
+		if (_florentStatus == 0) {
+			random = 2;
+		}
+
+		if (_florentStatus == 3) {
+			random = 3;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 2;
+			_florentStatus = 1;
+			break;
+
+		case 2:
+			resetFrame = 28;
+			break;
+
+		case 3:
+			resetFrame = 39;
+			break;
+
+		case 4:
+			resetFrame = 12;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+
+	case 24:
+	case 25:
+	case 26:
+	case 27:
+	case 33:
+		random = _vm->getRandomNumber(5, 20);
+
+		if (_florentStatus == 0) {
+			random = _vm->getRandomNumber(1, 4);
+			++_florentCount;
+			if (_florentCount > 5) {
+				_florentStatus = 1;
+				random = 5;
+			}
+		}
+
+		if ((_florentStatus == 2) ||
+			(_florentStatus == 3)) {
+				random = 5;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 23;
+			break;
+
+		case 2:
+			resetFrame = 24;
+			break;
+
+		case 3:
+			resetFrame = 25;
+			break;
+
+		case 4:
+			resetFrame = 26;
+			break;
+
+		case 5:
+			resetFrame = 34;
+			break;
+
+		default:
+			resetFrame = 32;
+			break;
+		}
+		break;
+
+	case 42:
+		if (_florentStatus == 3)
+			resetFrame = 41;
+
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
+		_florentFrame = resetFrame;
+	}
+}
+
+void Scene113::handle_animation_13_day() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _dayFrame)
+		return;
+
+	_dayFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int random;
+	int resetFrame = -1;
+	switch (_dayFrame) {
+	case 1:
+	case 4:
+	case 14:
+	case 17:
+	case 20:
+	case 26:
+	case 166:
+	case 206:
+	case 207:
+	case 208:
+	case 209:
+	case 210:
+	case 211:
+	case 219:
+	case 231:
+	case 253:
+		switch (_dayStatus) {
+		case 0:
+			random = _vm->getRandomNumber(1, 3);
+			++_dayCount;
+			if (_dayCount < 6) {
+				if (random == 1) {
+					resetFrame = 1;
+				} else if (random == 2) {
+					resetFrame = 15;
+				} else {
+					resetFrame = 18;
+				}
+			} else {
+				_dayStatus = 1;
+				resetFrame = 25;
+				_day_wants_to_talk = false;
+			}
+			break;
+
+		case 1:
+			if (_day_wants_to_talk) {
+				_dayStatus = 0;
+				_day_wants_to_talk = false;
+				resetFrame = 1;
+			} else {
+				resetFrame = 25;
+			}
+			break;
+
+		case 2:
+			random = _vm->getRandomNumber(1, 50);
+			switch (random) {
+			case 1:
+				resetFrame = 212;
+				break;
+
+			case 2:
+				resetFrame = 219;
+				break;
+
+			case 3:
+				resetFrame = 231;
+				break;
+
+			default:
+				resetFrame = 0;
+				break;
+			}
+			break;
+
+		case 3:
+			resetFrame = 5;
+			_dayStatus = 0;
+			break;
+
+		case 4:
+			resetFrame = 31;
+			break;
+
+		case 5:
+			resetFrame = _vm->getRandomNumber(205, 207);
+			++_standCount;
+			if (_standCount > 18) {
+				_dayStatus = 7;
+				resetFrame = 165;
+			}
+			if (_music_is_playing)
+				resetFrame = 167;
+			break;
+
+		case 6:
+			resetFrame = _vm->getRandomNumber(208, 210);
+			while (_lastDayResetFrame == resetFrame)
+				resetFrame = _vm->getRandomNumber(208, 210);
+
+			_lastDayResetFrame = resetFrame;
+
+			++_standCount;
+			if (_standCount > 18) {
+				_dayStatus = 7;
+				resetFrame = 165;
+			}
+
+			if (_music_is_playing)
+				resetFrame = 167;
+			break;
+
+		case 7:
+			resetFrame = 165;
+			if (_music_is_playing)
+				resetFrame = 167;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 182:
+		_game._player._visible = true;
+		_vm->_gameConv->release();
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game._player._playerPos = Common::Point(175, 148);
+		_game._player._turnToFacing = FACING_NORTHEAST;
+		_game._player.resetFacing(FACING_SOUTHEAST);
+		_game._player._turnToFacing = FACING_NORTHEAST;
+		break;
+
+	case 205:
+	case 212:
+		resetFrame = 211;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_dayFrame = resetFrame;
+	}
+}
+
+void Scene113::handle_animation_4_raoul() {
+	if (_globals[kFlorentNameIsKnown] == 2)
+		_raoulAction = 3;
+
+	if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _raoulFrame)
+		return;
+		
+	_raoulFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_raoulFrame) {
+	case 9:
+	case 10:
+	case 11:
+	case 34:
+	case 33:
+		if (_raoulFrame == 33)
+			_vm->_gameConv->release();
+
+		switch (_raoulAction) {
+		case 0:
+			resetFrame = _vm->getRandomNumber(7, 9);
+			++_raoulCount;
+
+			if (_raoulCount > 17) {
+				_raoulAction = 1;
+				resetFrame = 8;
+			}
+			break;
+
+		case 1:
+			resetFrame = 8;
+			break;
+
+		case 2:
+			resetFrame = 11;
+			break;
+
+		case 3:
+			resetFrame = 33;
+			break;
+
+		case 4:
+			resetFrame = 38;
+			_raoul_is_up = true;
+			_vm->_gameConv->hold();
+			break;
+
+		case 5:
+			resetFrame = 20;
+			_raoulAction = 1;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 19:
+		if ((_raoulAction == 5) && (!_game._objects.isInInventory(OBJ_SMALL_NOTE))) {
+			resetFrame = 20;
+			_raoulAction = 1;
+		} else if (_raoulAction == 4) {
+			resetFrame = 38;
+			_raoul_is_up = true;
+		} else if (_raoulAction == 0) {
+			resetFrame = 9;
+		} else {
+			resetFrame = 8;
+			_raoulAction = 1;
+		}
+		break;
+
+	case 42:
+		if (_raoulAction == 4) {
+			if (!_prevent_2) {
+				_vm->_gameConv->release();
+			}
+			resetFrame = 33;
+			_raoulAction = 3;
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 3, _globals._animationIndexes[3]);
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[3], resetFrame);
+		_raoulFrame = resetFrame;
+	}
+}
+
+void Scene113::handle_animation_13_raoul() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _raoulFrame)
+		return;
+
+	_raoulFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+	switch (_raoulFrame) {
+	case 9:
+	case 10:
+	case 11:
+	case 34:
+		switch (_raoulAction) {
+		case 0:
+			resetFrame = _vm->getRandomNumber(7, 9);
+			++_raoulCount;
+
+			if (_raoulCount > 17) {
+				_raoulAction = 1;
+				resetFrame = 8;
+			}
+			break;
+
+		case 1:
+			resetFrame = 8;
+			break;
+
+		case 2:
+			resetFrame = 11;
+			break;
+
+		case 3:
+			resetFrame = 33;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 19:
+		if (_raoulAction == 0)
+			resetFrame = 9;
+		else {
+			resetFrame = 8;
+			_raoulAction = 1;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_raoulFrame = resetFrame;
+	}
+}
+
+void Scene113::handle_animation_6_julie() {
+	if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _julieFrame)
+		return;
+
+	_julieFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random;
+
+	switch (_julieFrame) {
+	case 1:
+	case 2:
+	case 3:
+	case 11:
+	case 16:
+	case 17:
+		switch (_julieStatus) {
+		case 0:
+			random = _vm->getRandomNumber(4, 20);
+			break;
+
+		case 1:
+			random = _vm->getRandomNumber(1, 3);
+			++_julieCount;
+			if (_julieCount > 20) {
+				_julieStatus = 0;
+				random = 6;
+			}
+			break;
+
+		default:
+			random = -1;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 0;
+			break;
+
+		case 2:
+			resetFrame = 1;
+			break;
+
+		case 3:
+			resetFrame = 2;
+			break;
+
+		case 4:
+			resetFrame = 12;
+			break;
+
+		case 5:
+			resetFrame = 4;
+			break;
+
+		default:
+			resetFrame = 16;
+			break;
+		}
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[4], resetFrame);
+		_julieFrame = resetFrame;
+	}
+}
+
+void Scene113::process_conversation_dead() {
+	switch (_game._trigger) {
+	case 106:
+		_julieStatus = 1;
+		break;
+
+	case 104:
+		_julieStatus = 0;
+		break;
+
+	default:
+		break;
+	}
+
+	_vm->_gameConv->setInterlocutorTrigger(106);
+	_vm->_gameConv->setHeroTrigger(104);
+
+	_julieCount = 0;
+}
+
+void Scene113::process_conversation_florent() {
+	int random;
+
+	switch (_action._activeAction._verbId) {
+	case 3:
+	case 4:
+		if (!_prevent_1) {
+			_globals[kFlorentNameIsKnown] = 1;
+			_vm->_gameConv->setInterlocutorTrigger(82);
+			_scene->_dynamicHotspots.remove(_christineHotspotId2);
+			_christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29));
+			_scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST);
+			_prevent_1 = true;
+		}
+		break;
+
+	case 19:
+		_florentStatus = 2;
+		_vm->_gameConv->setInterlocutorTrigger(86);
+		break;
+
+	case 25:
+		if (_raoulAction != 3)
+			_raoulAction = 4;
+		break;
+
+	case 26:
+		if (!_prevent_2) {
+			_scene->_sequences.setTimingTrigger(120, 92);
+			_vm->_gameConv->setInterlocutorTrigger(96);
+			_florentStatus = 0;
+			_prevent_2 = true;
+		}
+		break;
+
+	case 27:
+	case 30:
+		_vm->_gameConv->setInterlocutorTrigger(98);
+		break;
+
+	case 28:
+	case 29:
+		_vm->_gameConv->setInterlocutorTrigger(100);
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 62:
+		if ((_action._activeAction._verbId != 3) && (_action._activeAction._verbId != 4) && (_action._activeAction._verbId != 19) &&
+			(_action._activeAction._verbId != 27) && (_action._activeAction._verbId != 28) && (_action._activeAction._verbId != 29)) {
+				if ((_raoulAction != 5) && (_raoulAction != 4) && !_raoul_is_up)
+					_raoulAction = 0;
+
+				if ((_florentStatus != 3) && (_florentStatus != 2))
+					_florentStatus = 1;
+		}
+		break;
+
+	case 66:
+		if ((_florentStatus != 3) &&
+			(_florentStatus != 2)) {
+				random = _vm->getRandomNumber(1,5);
+				if (random == 1)
+					_florentStatus = 0;
+		}
+
+		if ((_raoulAction != 3) && (_raoulAction != 5) && (_raoulAction != 4) && (!_raoul_is_up)) {
+			_raoulAction = 1;
+			random = _vm->getRandomNumber(1, 2);
+			if (random == 1)
+				_raoulAction = 2;
+		}
+		break;
+
+	case 80:
+		_vm->_gameConv->release();
+		_game._player._visible = false;
+		_raoulAction = 1;
+		_game.syncTimers(3, _globals._animationIndexes[3], 2, 0);
+		_scene->setAnimFrame(_globals._animationIndexes[3], 1);
+		break;
+
+	case 82:
+		_florentStatus = 0;
+		_scene->_sequences.setTimingTrigger(120, 84);
+		_vm->_gameConv->hold();
+		break;
+
+	case 84:
+		_game._player.walk(Common::Point(201, 120), FACING_SOUTH);
+		_game._player.setWalkTrigger(80);
+		break;
+
+	case 86:
+		_raoulAction = 5;
+		_vm->_gameConv->hold();
+		break;
+
+	case 92:
+		_game._player.walk(Common::Point(68, 142), FACING_SOUTHWEST);
+		_game._player.setWalkTrigger(94);
+		break;
+
+	case 94:
+		_globals[kStopWalkerDisabled] = true;
+		_globals[kFlorentNameIsKnown] = 2;
+		_vm->_gameConv->release();
+		break;
+
+	case 96:
+		_vm->_gameConv->hold();
+		break;
+
+	case 98:
+		_florentStatus = 3;
+		break;
+
+	case 100:
+		_florentStatus = 1;
+		_globals[kStopWalkerDisabled] = false;
+		break;
+
+	default:
+		break;
+	}
+
+	if ((_action._activeAction._verbId != 3) && (_action._activeAction._verbId != 4) && (_action._activeAction._verbId != 19) &&
+		(_action._activeAction._verbId != 28) && (_action._activeAction._verbId != 29) && (_action._activeAction._verbId != 27) &&
+		(_action._activeAction._verbId != 30) && (_action._activeAction._verbId != 26))
+		_vm->_gameConv->setInterlocutorTrigger(66);
+
+	_vm->_gameConv->setHeroTrigger(62);
+	_raoulCount = 0;
+	_florentCount = 0;
+}
+
+void Scene113::process_conversation_love() {
+	int random;
+
+	switch (_action._activeAction._verbId) {
+	case 1:
+	case 2:
+		if (!_prevent_1) {
+			_vm->_gameConv->setInterlocutorTrigger(82);
+			_prevent_1 = true;
+		}
+		break;
+
+	case 21:
+		if (!_arms_are_out) {
+			_dayStatus = 4;
+			_scene->_sequences.setTimingTrigger(1, 70);
+			_scene->_userInterface.emptyConversationList();
+			_scene->_userInterface.setup(kInputConversation);
+			_scene->_hotspots.activate(NOUN_CHRISTINE, false);
+			_vm->_gameConv->hold();
+		}
+		break;
+
+	case 27:
+		_vm->_sound->command(34);
+		_globals[kLeaveAngelMusicOn] = true;
+		break;
+
+	case 31:
+		if (!_music_is_playing) {
+			_vm->_gameConv->hold();
+			_dayStatus = 7;
+			_music_is_playing = true;
+			_christineHotspotId1 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots[_christineHotspotId1]._articleNumber = PREP_ON;
+			_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 14);
+			_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 16);
+		}
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 62:
+		if (_action._activeAction._verbId != 0) {
+			if (_standing_talking) {
+				_dayStatus = 6;
+			} else if (_dayStatus != 4) {
+				_dayStatus = 1;
+				_raoulAction = 0;
+				_day_wants_to_talk = false;
+			}
+		}
+		break;
+
+	case 66:
+		if (_standing_talking) {
+			_dayStatus = 5;
+
+		} else {
+			if (_action._activeAction._verbId == 19) {
+				_dayStatus = 3;
+			} else {
+				_dayStatus = 1;
+				_day_wants_to_talk = true;
+			}
+
+			if (_raoulAction != 3) {
+				_raoulAction = 1;
+				random = _vm->getRandomNumber(1, 2);
+				if (random == 1) {
+					_raoulAction = 2;
+				}
+			}
+		}
+		break;
+
+	case 70:
+		if (_arms_are_out) {
+			_vm->_gameConv->release();
+			_vm->_gameConv->setInterlocutorTrigger(76);
+		}
+		break;
+
+	case 72:
+		if (_right_after_kiss)
+			_vm->_gameConv->release();
+		else
+			_scene->_sequences.setTimingTrigger(1, 72);
+		break;
+
+	case 76:
+		_vm->_gameConv->hold();
+		_scene->_sequences.setTimingTrigger(1, 72);
+		break;
+
+	case 78:
+		if (_arms_are_out) {
+			_vm->_gameConv->release();
+			_vm->_gameConv->setInterlocutorTrigger(76);
+		}
+		break;
+
+	case 80:
+		_vm->_gameConv->release();
+		_game._player._visible = false;
+		_raoulAction = 1;
+		_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+		_scene->setAnimFrame(_globals._animationIndexes[1], 1);
+		break;
+
+	case 82:
+		_scene->_sequences.setTimingTrigger(120, 84);
+		_vm->_gameConv->hold();
+		_dayStatus = 1;
+		_day_wants_to_talk = true;
+		break;
+
+	case 84:
+		_game._player.walk(Common::Point(201, 120), FACING_SOUTH);
+		_game._player.setWalkTrigger(80);
+		break;
+
+	default:
+		break;
+	}
+
+	if ((_action._activeAction._verbId != 21) && (_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 2))
+		_vm->_gameConv->setInterlocutorTrigger(66);
+
+	_vm->_gameConv->setHeroTrigger(62);
+
+	_raoulCount = 0;
+	_dayCount = 0;
+	_standCount = 0;
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 05cf173..820cc7d 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -338,6 +338,59 @@ public:
 	virtual void actions();
 };
 
+class Scene113 : public Scene1xx {
+private:
+	bool _standing_talking;
+	bool _day_wants_to_talk;
+	bool _music_is_playing;
+	bool _right_after_kiss;
+	bool _anim_0_running;
+	bool _anim_1_running;
+	bool _anim_2_running;
+	bool _anim_3_running;
+	bool _anim_4_running;
+	bool _prevent_1;
+	bool _prevent_2;
+	bool _raoul_is_up;
+	bool _arms_are_out;
+
+	int _christineHotspotId1;
+	int _christineHotspotId2;
+	int _dayStatus;
+	int _dayFrame;
+	int _dayCount;
+	int _florentStatus;
+	int _florentFrame;
+	int _florentCount;
+	int _julieStatus;
+	int _julieFrame;
+	int _julieCount;
+	int _raoulAction;
+	int _raoulFrame;
+	int _raoulCount;
+	int _lastDayResetFrame;
+	int _standCount;
+
+	void handle_animation_florent();
+	void handle_animation_13_day();
+	void handle_animation_4_raoul();
+	void handle_animation_13_raoul();
+	void handle_animation_6_julie();
+	void process_conversation_dead();
+	void process_conversation_florent();
+	void process_conversation_love();
+
+public:
+	Scene113(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index d62e333..ea5943c 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -61,6 +61,7 @@ Scene::Scene(MADSEngine *vm)
 	_spritesCount = 0;
 	_variant = 0;
 	_initialVariant = 0;
+	_speechReady = -1;
 
 	_paletteUsageF.push_back(PaletteUsage::UsageEntry(0xF));
 
@@ -432,10 +433,7 @@ void Scene::doFrame() {
 				_sequences.tick();
 
 				// Handle any active animation
-				for (int i = 0; i < 10; i++) {
-					if (_animation[i])
-						_animation[i]->update();
-				}
+				animations_tick();
 			}
 
 			// If the debugget flag is set, show the mouse position
@@ -794,4 +792,13 @@ void Scene::playSpeech(int idx) {
 void Scene::sceneScale(int front_y, int front_scale, int back_y,  int back_scale) {
 	warning("TODO: Scene:scaleRoom");
 }
+
+void Scene::animations_tick() {
+	warning("TODO: Implement _animations as an AnimationList and refactor (and check implementation)");
+	for (int i = 0; i < 10; i++) {
+		if (_animation[i])
+			_animation[i]->update();
+	}
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index 9289593..f0b4326 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -129,7 +129,7 @@ public:
 	Common::Point _customDest;
 	Common::Array<PaletteUsage::UsageEntry> _paletteUsageF;
 	Common::Array<PaletteUsage::UsageEntry> _scenePaletteUsage;
-
+	int _speechReady;
 	/**
 	 * Constructor
 	 */
@@ -265,6 +265,7 @@ public:
 	void loadSpeech(int idx);
 	void playSpeech(int idx);
 	void sceneScale(int front_y, int front_scale, int back_y,  int back_scale);
+	void animations_tick();
 };
 
 } // End of namespace MADS


Commit: 5b02ca13163eaacbf930e9626f91b8fbe0851d32
    https://github.com/scummvm/scummvm/commit/5b02ca13163eaacbf930e9626f91b8fbe0851d32
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-20T16:29:20+02:00

Commit Message:
MADS: Phantom: Fix calls to setDynamicAnim in Scene 101

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 2ed2cbf..17b2a8a 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -194,28 +194,25 @@ void Scene101::enter() {
 		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_brieAnimId, Common::Point(490, 119), FACING_NONE);
-		// FIXME: 2nd parameter is wrong
-		_scene->setDynamicAnim(_brieAnimId, 0, 0);
-		_scene->setDynamicAnim(_brieAnimId, 0, 1);
-		_scene->setDynamicAnim(_brieAnimId, 0, 2);
-		_scene->setDynamicAnim(_brieAnimId, 0, 3);
-		_scene->setDynamicAnim(_brieAnimId, 0, 4);
+		_scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 0);
+		_scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 1);
+		_scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 2);
+		_scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 3);
+		_scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 4);
 
 		int tmpIdx = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(25, 80), FACING_NONE);
-		//FIXME: 2nd paramater is wrong
-		_scene->setDynamicAnim(tmpIdx, 1, 1);
-		_scene->setDynamicAnim(tmpIdx, 1, 2);
+		_scene->setDynamicAnim(tmpIdx, _globals._animationIndexes[1], 1);
+		_scene->setDynamicAnim(tmpIdx, _globals._animationIndexes[1], 2);
 
 		_talkCounter = 0;
 	} else if (_globals[kBrieTalkStatus] == 1) {
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1);
 		_brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
 		_scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON;
-		//FIXME: 2nd parameter is wrong
-		_scene->setDynamicAnim(_brieAnimId, 1, 1);
-		_scene->setDynamicAnim(_brieAnimId, 1, 2);
+		_scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[1], 1);
+		_scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[1], 2);
 		_anim1Running = true;
 		_talkCounter = 0;
 		_chandelierStatus = 3;
@@ -498,104 +495,107 @@ void Scene101::handleAnimation0() {
 }
 
 void Scene101::handleAnimation1() {
-	int random;
-	int resetFrame;
+	if (_scene->getAnimFrame(_globals._animationIndexes[1]) == _chandelierFrame)
+		return;
 
-	if (_scene->getAnimFrame(_globals._animationIndexes[1]) != _chandelierFrame) {
-		_chandelierFrame = _scene->getAnimFrame(_globals._animationIndexes[1]);
-		resetFrame = -1;
-		switch (_chandelierFrame) {
-		case 1:
-			if (_chandelierStatus == 3)
-				resetFrame = 0;
-			break;
+	_chandelierFrame = _scene->getAnimFrame(_globals._animationIndexes[1]);
+	int resetFrame = -1;
+	switch (_chandelierFrame) {
+	case 1:
+		if (_chandelierStatus == 3)
+			resetFrame = 0;
+		break;
 
-		case 11:
-		case 14:
-		case 17:
-		case 19:
-		case 26:
-		case 44:
-		case 333:
-			if (_talkCounter == _chanStatus) {
-				_chandelierStatus = 0;
-				++_talkCounter;
-				_chanStatus = -1;
-			}
+	case 11:
+	case 14:
+	case 17:
+	case 19:
+	case 26:
+	case 44:
+	case 333:
+		if (_talkCounter == _chanStatus) {
+			_chandelierStatus = 0;
+			++_talkCounter;
+			_chanStatus = -1;
+		}
 
-			if (_talkCounter == _wipeStatus) {
-				_chandelierStatus = 6;
-				++_talkCounter;
-				_wipeStatus = -1;
-			}
+		if (_talkCounter == _wipeStatus) {
+			_chandelierStatus = 6;
+			++_talkCounter;
+			_wipeStatus = -1;
+		}
 
-			if (_startWalkingFl) {
-				if (_vm->_gameConv->_running == 1) {
-					if (_talkCounter > 13)
-						_chandelierStatus = 1;
-				} else
+		if (_startWalkingFl) {
+			if (_vm->_gameConv->_running == 1) {
+				if (_talkCounter > 13)
 					_chandelierStatus = 1;
-			}
+			} else
+				_chandelierStatus = 1;
+		}
 
-			switch (_chandelierStatus) {
-			case 0:
-				resetFrame = 27;
-				_chandelierStatus = 2;
-				break;
+		switch (_chandelierStatus) {
+		case 0:
+			resetFrame = 27;
+			_chandelierStatus = 2;
+			break;
 
-			case 1:
-				_globals[kBrieTalkStatus] = 2;
-				resetFrame = 45;
-				if (_vm->_gameConv->_running == 1)
-					_vm->_gameConv->stop();
-				_scene->_dynamicHotspots.remove(_brieAnimId);
-				_game._player._stepEnabled = false;
-				break;
+		case 1:
+			_globals[kBrieTalkStatus] = 2;
+			resetFrame = 45;
+			if (_vm->_gameConv->_running == 1)
+				_vm->_gameConv->stop();
+			_scene->_dynamicHotspots.remove(_brieAnimId);
+			_game._player._stepEnabled = false;
+			break;
 
-			case 2:
-				random = _vm->getRandomNumber(1, 3);
-				++_talkCounter;
-				if (_talkCounter < 15) {
-					if (random == 1)
-						resetFrame = 12;
-					else if (random == 2)
-						resetFrame = 14;
-					else if (random == 3)
-						resetFrame = 17;
-				} else {
-					_chandelierStatus = 4;
-					resetFrame = 25;
-				}
-				break;
+		case 2:
+			++_talkCounter;
+			if (_talkCounter < 15) {
+				switch (_vm->getRandomNumber(1, 3)) {
+				case 1:
+					resetFrame = 12;
+					break;
 
-			case 4:
+				case 2:
+					resetFrame = 14;
+					break;
+
+				case 3:
+					resetFrame = 17;
+				}
+			} else {
+				_chandelierStatus = 4;
 				resetFrame = 25;
-				break;
+			}
+			break;
 
-			case 5:
-				resetFrame = 21;
-				_chandelierStatus = 2;
-				break;
+		case 4:
+			resetFrame = 25;
+			break;
 
-			case 6:
-				resetFrame = 316;
-				_chandelierStatus = 2;
-				break;
+		case 5:
+			resetFrame = 21;
+			_chandelierStatus = 2;
+			break;
 
-			default:
-				break;
-			}
+		case 6:
+			resetFrame = 316;
+			_chandelierStatus = 2;
 			break;
 
-		case 315:
-			_scene->freeAnimation(1);
+		default:
 			break;
 		}
+		break;
 
-		if (resetFrame >= 0) {
-			_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
-			_chandelierFrame = resetFrame;
-		}
+	case 315:
+		_scene->freeAnimation(1);
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_chandelierFrame = resetFrame;
 	}
 }
 


Commit: 3864ad17ac8b45db2976b9bc9bea6aa5fee260a9
    https://github.com/scummvm/scummvm/commit/3864ad17ac8b45db2976b9bc9bea6aa5fee260a9
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-20T16:40:44+02:00

Commit Message:
MADS: Phantom: Some refactoring and renaming

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 17b2a8a..c49d4c1 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -7387,136 +7387,135 @@ void Scene112::handleConversation() {
 }
 
 void Scene112::handleJulieAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _julieFrame)
+		return;
+
+	_julieFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
 	int random = -1;
-	int resetFrame;
+	int resetFrame = -1;
 
-	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _julieFrame) {
-		_julieFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
-		resetFrame = -1;
+	switch (_julieFrame) {
+	case 1:
+	case 2:
+	case 3:
+	case 22:
+	case 39:
+	case 71:
+	case 107:
+		switch (_julieAction) {
+		case 0:
+			random = _vm->getRandomNumber(4, 6);
+			++_julieCounter;
+			if (_julieCounter > 25)
+				_julieAction = 2;
+			break;
 
-		switch (_julieFrame) {
 		case 1:
-		case 2:
-		case 3:
-		case 22:
-		case 39:
-		case 71:
-		case 107:
-			switch (_julieAction) {
-			case 0:
-				random = _vm->getRandomNumber(4, 6);
-				++_julieCounter;
-				if (_julieCounter > 25)
-					_julieAction = 2;
-				break;
-
-			case 1:
-				random = 3;
-				break;
+			random = 3;
+			break;
 
-			case 2:
+		case 2:
+			random = _vm->getRandomNumber(1, 3);
+			while (_didOptionFl == random)
 				random = _vm->getRandomNumber(1, 3);
-				while (_didOptionFl == random)
-					random = _vm->getRandomNumber(1, 3);
-				_didOptionFl = random;
-				break;
+			_didOptionFl = random;
+			break;
 
-			default:
-				break;
-			}
+		default:
+			break;
+		}
 
-			switch (random) {
-			case 1:
-				resetFrame = 22;
-				break;
+		switch (random) {
+		case 1:
+			resetFrame = 22;
+			break;
 
-			case 2:
-				resetFrame = 39;
-				break;
+		case 2:
+			resetFrame = 39;
+			break;
 
-			case 3:
-				resetFrame = 83;
-				break;
+		case 3:
+			resetFrame = 83;
+			break;
 
-			case 4:
-				resetFrame = 0;
-				break;
+		case 4:
+			resetFrame = 0;
+			break;
 
-			case 5:
-				resetFrame = 1;
-				break;
+		case 5:
+			resetFrame = 1;
+			break;
 
-			case 6:
-				resetFrame = 2;
-				break;
+		case 6:
+			resetFrame = 2;
+			break;
 
-			default:
-				break;
-			}
+		default:
 			break;
-		case 56:
-		case 77:
-		case 83:
+		}
+		break;
+	case 56:
+	case 77:
+	case 83:
+		random = _vm->getRandomNumber(1, 3);
+		while (_didOptionFl == random)
 			random = _vm->getRandomNumber(1, 3);
-			while (_didOptionFl == random)
-				random = _vm->getRandomNumber(1, 3);
-			_didOptionFl = random;
-
-			if ((_julieAction == 0) || (_julieAction == 1))
-				random = 3;
-
-			switch (random) {
-			case 1:
-				resetFrame = 71;
-				break;
+		_didOptionFl = random;
 
-			case 2:
-				resetFrame = 77;
-				break;
+		if ((_julieAction == 0) || (_julieAction == 1))
+			random = 3;
 
-			case 3:
-				resetFrame = 56;
-				break;
+		switch (random) {
+		case 1:
+			resetFrame = 71;
+			break;
 
-			default:
-				break;
-			}
+		case 2:
+			resetFrame = 77;
+			break;
 
+		case 3:
+			resetFrame = 56;
 			break;
 
-		case 95:
-			if (_julieAction == 1)
-				random = 2;
-			else
-				random = 1;
+		default:
+			break;
+		}
 
-			switch (random) {
-			case 1:
-				resetFrame = 95;
-				break;
+		break;
 
-			case 2:
-				resetFrame = 107;
-				break;
+	case 95:
+		if (_julieAction == 1)
+			random = 2;
+		else
+			random = 1;
 
-			default:
-				break;
-			}
+		switch (random) {
+		case 1:
+			resetFrame = 95;
 			break;
 
-		case 130:
-			resetFrame = 95;
-			_julieAction = 2;
+		case 2:
+			resetFrame = 107;
 			break;
 
 		default:
 			break;
 		}
+		break;
 
-		if (resetFrame >= 0) {
-			_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
-			_julieFrame = resetFrame;
-		}
+	case 130:
+		resetFrame = 95;
+		_julieAction = 2;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_julieFrame = resetFrame;
 	}
 }
 
@@ -8006,16 +8005,16 @@ void Scene113::enter() {
 
 void Scene113::step() {
 	if (_anim_1_running)
-		handle_animation_13_raoul();
+		handleRaoulAnimation2();
 
 	if (_anim_4_running)
-		handle_animation_6_julie();
+		handleJulieAnimation();
 
 	if (_anim_2_running)
-		handle_animation_florent();
+		handleFlorentAnimation();
 
 	if (_anim_3_running) {
-		handle_animation_4_raoul();
+		handleRaoulAnimation();
 
 		if ((!_game._objects.isInInventory(OBJ_SMALL_NOTE)) && (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 26)) {
 			_scene->_hotspots.activate(NOUN_SMALL_NOTE, false);
@@ -8037,7 +8036,7 @@ void Scene113::step() {
 	}
 
 	if (_anim_0_running) {
-		handle_animation_13_day();
+		handleDayAnimation();
 
 		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 95) && (!_arms_are_out)) {
 			_standing_talking = true;
@@ -8082,19 +8081,19 @@ void Scene113::step() {
 
 void Scene113::actions() {
 	if (_vm->_gameConv->_running == 13) {
-		process_conversation_love();
+		handleLoveConversation();
 		_action._inProgress = false;
 		return;
 	}
 
 	if (_vm->_gameConv->_running == 4) {
-		process_conversation_florent();
+		handleFlorentConversation();
 		_action._inProgress = false;
 		return;
 	}
 
 	if (_vm->_gameConv->_running == 6) {
-		process_conversation_dead();
+		handleDeadConversation();
 		_action._inProgress = false;
 		return;
 	}
@@ -8369,7 +8368,7 @@ void Scene113::preActions() {
 	}
 }
 
-void Scene113::handle_animation_florent() {
+void Scene113::handleFlorentAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _florentFrame)
 		return;
 
@@ -8482,7 +8481,7 @@ void Scene113::handle_animation_florent() {
 	}
 }
 
-void Scene113::handle_animation_13_day() {
+void Scene113::handleDayAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _dayFrame)
 		return;
 
@@ -8629,7 +8628,7 @@ void Scene113::handle_animation_13_day() {
 	}
 }
 
-void Scene113::handle_animation_4_raoul() {
+void Scene113::handleRaoulAnimation() {
 	if (_globals[kFlorentNameIsKnown] == 2)
 		_raoulAction = 3;
 
@@ -8724,7 +8723,7 @@ void Scene113::handle_animation_4_raoul() {
 	}
 }
 
-void Scene113::handle_animation_13_raoul() {
+void Scene113::handleRaoulAnimation2() {
 	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _raoulFrame)
 		return;
 
@@ -8782,7 +8781,7 @@ void Scene113::handle_animation_13_raoul() {
 	}
 }
 
-void Scene113::handle_animation_6_julie() {
+void Scene113::handleJulieAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _julieFrame)
 		return;
 
@@ -8850,7 +8849,7 @@ void Scene113::handle_animation_6_julie() {
 	}
 }
 
-void Scene113::process_conversation_dead() {
+void Scene113::handleDeadConversation() {
 	switch (_game._trigger) {
 	case 106:
 		_julieStatus = 1;
@@ -8870,7 +8869,7 @@ void Scene113::process_conversation_dead() {
 	_julieCount = 0;
 }
 
-void Scene113::process_conversation_florent() {
+void Scene113::handleFlorentConversation() {
 	int random;
 
 	switch (_action._activeAction._verbId) {
@@ -9010,7 +9009,7 @@ void Scene113::process_conversation_florent() {
 	_florentCount = 0;
 }
 
-void Scene113::process_conversation_love() {
+void Scene113::handleLoveConversation() {
 	int random;
 
 	switch (_action._activeAction._verbId) {
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 820cc7d..8a9ba84 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -371,14 +371,14 @@ private:
 	int _lastDayResetFrame;
 	int _standCount;
 
-	void handle_animation_florent();
-	void handle_animation_13_day();
-	void handle_animation_4_raoul();
-	void handle_animation_13_raoul();
-	void handle_animation_6_julie();
-	void process_conversation_dead();
-	void process_conversation_florent();
-	void process_conversation_love();
+	void handleFlorentAnimation();
+	void handleDayAnimation();
+	void handleRaoulAnimation();
+	void handleRaoulAnimation2();
+	void handleJulieAnimation();
+	void handleDeadConversation();
+	void handleFlorentConversation();
+	void handleLoveConversation();
 
 public:
 	Scene113(MADSEngine *vm);


Commit: 44a28dbd49b4f4b19a609d5447a23f92e80545e5
    https://github.com/scummvm/scummvm/commit/44a28dbd49b4f4b19a609d5447a23f92e80545e5
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-20T16:52:43+02:00

Commit Message:
MADS: Phantom: Move Exit and Climb to verbs. Review calls to isAction, use isObject instead when needed

Changed paths:
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index c51c11e..3c20b95 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -49,6 +49,7 @@ enum Verb {
 	VERB_CLIMB_DOWN = 0x21,
 	VERB_CLIMB_INTO = 0x22,
 	VERB_CLIMB_THROUGH = 0x23,
+	VERB_EXIT = 0x34,
 	VERB_EXIT_TO = 0x37,
 	VERB_JUMP_INTO = 0x53,
 	VERB_LOCK = 0x5D,
@@ -63,7 +64,8 @@ enum Verb {
 	VERB_WALK_UP = 0x9C,
 	VERB_CLIMB_UP = 0xA5,
 	VERB_WALK_ONTO = 0xA6,
-	VERB_WALK = 0xA7
+	VERB_WALK = 0xA7,
+	VERB_CLIMB = 0x120
 };
 
 enum Noun {
@@ -104,7 +106,6 @@ enum Noun {
 	NOUN_DRESSING_TABLE = 0x31,
 	NOUN_ELEPHANT_PROP = 0x32,
 	NOUN_ENVELOPE = 0x33,
-	NOUN_EXIT = 0x34,
 	NOUN_EXIT_DOWN = 0x35,
 	NOUN_EXIT_SIGN = 0x36,
 	NOUN_EXIT_TO_BACKSTAGE = 0x38,
@@ -325,7 +326,6 @@ enum Noun {
 	NOUN_MIDDLE_LEVEL = 0x11D,
 	NOUN_LOWER_LEVEL = 0x11E,
 	NOUN_LADDER = 0x11F,
-	NOUN_CLIMB = 0x120,
 	NOUN_CHANDELIER_TRAP = 0x121,
 	NOUN_PIECE_OF_WOOD = 0x122,
 	NOUN_CUT_HEMP = 0x123,
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index c49d4c1..a705e7d 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -862,7 +862,7 @@ void Scene103::setup() {
 	_scene->addActiveVocab(NOUN_PROMPTERS_STAND);
 	_scene->addActiveVocab(NOUN_JACQUES);
 	_scene->addActiveVocab(NOUN_GENTLEMAN);
-	_scene->addActiveVocab(NOUN_CLIMB);
+	_scene->addActiveVocab(VERB_CLIMB);
 }
 
 void Scene103::enter() {
@@ -968,7 +968,7 @@ void Scene103::enter() {
 		_scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt4, promptPos, promptFacing);
 
-		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 121 + 40, 49 + 30));
+		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 121 + 40, 49 + 30));
 		_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST);
 		_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
@@ -1046,7 +1046,7 @@ void Scene103::enter() {
 		_scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST);
 
-		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 2 + 40, 49 + 30));
+		_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 2 + 40, 49 + 30));
 		_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 		_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST);
 		_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
@@ -1268,13 +1268,13 @@ void Scene103::preActions() {
 
 	if ((_standPosition != 0) && !_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) &&
 		!_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR) &&
-		!_action.isAction(NOUN_CLIMB, NOUN_PROMPTERS_STAND) &&
+		!_action.isAction(VERB_CLIMB, NOUN_PROMPTERS_STAND) &&
 		!_action.isAction(VERB_PUSH, NOUN_TRAP_DOOR) &&
 		!_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) &&
 		!_action.isAction(VERB_PULL, NOUN_TRAP_DOOR)) {
 
 		if (_action.isAction(VERB_PULL) || _action.isAction(VERB_PUSH)) {
-			if (!_action.isAction(NOUN_LEVER) && !_game._trigger)
+			if (!_action.isObject(NOUN_LEVER) && !_game._trigger)
 				_game._player._needToWalk = false;
 		}
 
@@ -1401,7 +1401,7 @@ void Scene103::actions() {
 		return;
 	}
 
-	if ((_action.isAction(NOUN_CLIMB, NOUN_PROMPTERS_STAND) && _standPosition == 0) ||
+	if ((_action.isAction(VERB_CLIMB, NOUN_PROMPTERS_STAND) && _standPosition == 0) ||
 		(_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) && (_standPosition == 0)) ||
 		(_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) && (_standPosition == 0))) {
 		if (_globals[kPrompterStandStatus] == 0) {
@@ -1435,7 +1435,7 @@ void Scene103::actions() {
 		}
 	}
 
-	if (_action.isAction(NOUN_CLIMB, NOUN_PROMPTERS_STAND) && (_standPosition != 0)) {
+	if (_action.isAction(VERB_CLIMB, NOUN_PROMPTERS_STAND) && (_standPosition != 0)) {
 		_action._inProgress = false;
 		return;
 	}
@@ -1493,7 +1493,7 @@ void Scene103::actions() {
 						_scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt4, Common::Point(171, 142), FACING_NORTHWEST);
 
-						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 121 + 40, 49 + 30));
+						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 121 + 40, 49 + 30));
 						_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST);
 						_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
@@ -1568,7 +1568,7 @@ void Scene103::actions() {
 						_scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE);
 
-						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, NOUN_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 2 + 40, 49 + 30));
+						_hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 2 + 40, 49 + 30));
 						_scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON;
 						_scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST);
 						_scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP);
@@ -1857,7 +1857,7 @@ void Scene103::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_PROMPTERS_STAND)) {
+		if (_action.isObject(NOUN_PROMPTERS_STAND)) {
 			if (_globals[kJacquesStatus] >= 1)
 				_vm->_dialogs->show(10349);
 			else if (_globals[kCurrentYear] == 1993)
@@ -1868,49 +1868,49 @@ void Scene103::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_FLOOR)) {
 			_vm->_dialogs->show(10313);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_TRAP_CEILING)) {
+		if (_action.isObject(NOUN_TRAP_CEILING)) {
 			_vm->_dialogs->show(10314);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DOOR)) {
+		if (_action.isObject(NOUN_DOOR)) {
 			_vm->_dialogs->show(10315);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DOOR_TO_PIT)) {
+		if (_action.isObject(NOUN_DOOR_TO_PIT)) {
 			_vm->_dialogs->show(10316);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(10317);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROMPTERS_BOX)) {
+		if (_action.isObject(NOUN_PROMPTERS_BOX)) {
 			_vm->_dialogs->show(10318);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_TRAP_DOOR)) {
+		if (_action.isObject(NOUN_TRAP_DOOR)) {
 			_vm->_dialogs->show(10319);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_JUNK)) {
+		if (_action.isObject(NOUN_JUNK)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(10320);
 			else
@@ -1919,7 +1919,7 @@ void Scene103::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_CARTON)) {
+		if (_action.isObject(NOUN_CARTON)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(10321);
 			else
@@ -1928,7 +1928,7 @@ void Scene103::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_GARBAGE_CAN)) {
+		if (_action.isObject(NOUN_GARBAGE_CAN)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(10322);
 			else
@@ -1937,13 +1937,13 @@ void Scene103::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_CABLE)) {
+		if (_action.isObject(NOUN_CABLE)) {
 			_vm->_dialogs->show(10323);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_JACQUES) || _action.isAction(NOUN_GENTLEMAN)) {
+		if (_action.isObject(NOUN_JACQUES) || _action.isObject(NOUN_GENTLEMAN)) {
 			if (_globals[kJacquesStatus] == 0)
 				_vm->_dialogs->show(10324);
 			else
@@ -1952,37 +1952,37 @@ void Scene103::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_KEY) && _game._objects.isInRoom(OBJ_KEY)) {
+		if (_action.isObject(NOUN_KEY) && _game._objects.isInRoom(OBJ_KEY)) {
 			_vm->_dialogs->show(10326);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAIR_UNIT)) {
+		if (_action.isObject(NOUN_STAIR_UNIT)) {
 			_vm->_dialogs->show(10327);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_EXPOSED_BRICK)) {
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
 			_vm->_dialogs->show(10328);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WATER_PIPE)) {
+		if (_action.isObject(NOUN_WATER_PIPE)) {
 			_vm->_dialogs->show(10329);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROMPTERS_SEAT)) {
+		if (_action.isObject(NOUN_PROMPTERS_SEAT)) {
 			_vm->_dialogs->show(10338);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LEVER)) {
+		if (_action.isObject(NOUN_LEVER)) {
 			_vm->_dialogs->show(10339);
 			_action._inProgress = false;
 			return;
@@ -2668,10 +2668,10 @@ void Scene104::step() {
 }
 
 void Scene104::preActions() {
-	if (_action.isAction(NOUN_EXIT, NOUN_STAGE_LEFT))
+	if (_action.isAction(VERB_EXIT, NOUN_STAGE_LEFT))
 		_game._player._walkOffScreenSceneId = 108;
 
-	if (_action.isAction(NOUN_EXIT, NOUN_STAGE_RIGHT))
+	if (_action.isAction(VERB_EXIT, NOUN_STAGE_RIGHT))
 		_game._player._walkOffScreenSceneId = 107;
 
 	if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR) || _action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR))
@@ -2773,61 +2773,61 @@ void Scene104::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_STAGE)) {
+		if (_action.isObject(NOUN_STAGE)) {
 			_vm->_dialogs->show(10412);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_APRON)) {
+		if (_action.isObject(NOUN_APRON)) {
 			_vm->_dialogs->show(10413);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROSCENIUM_ARCH)) {
+		if (_action.isObject(NOUN_PROSCENIUM_ARCH)) {
 			_vm->_dialogs->show(10414);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_ACT_CURTAIN)) {
+		if (_action.isObject(NOUN_ACT_CURTAIN)) {
 			_vm->_dialogs->show(10415);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_ORCHESTRA_PIT)) {
+		if (_action.isObject(NOUN_ORCHESTRA_PIT)) {
 			_vm->_dialogs->show(10416);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CONDUCTORS_STAND)) {
+		if (_action.isObject(NOUN_CONDUCTORS_STAND)) {
 			_vm->_dialogs->show(10417);
 			_action._inProgress = false;
 			return;
 		}
 
-		if ((_action.isAction(NOUN_MUSIC_STAND)) || (_action.isAction(NOUN_MUSIC_STANDS))) {
+		if ((_action.isObject(NOUN_MUSIC_STAND)) || (_action.isObject(NOUN_MUSIC_STANDS))) {
 			_vm->_dialogs->show(10418);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROMPTERS_BOX)) {
+		if (_action.isObject(NOUN_PROMPTERS_BOX)) {
 			_vm->_dialogs->show(10419);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_TRAP_DOOR)) {
+		if (_action.isObject(NOUN_TRAP_DOOR)) {
 			_vm->_dialogs->show(10420);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_HOUSE)) {
+		if (_action.isObject(NOUN_HOUSE)) {
 			if (_globals[kCurrentYear] == 1881)
 				_vm->_dialogs->show(10421);
 			else
@@ -2837,25 +2837,25 @@ void Scene104::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGE_LEFT)) {
+		if (_action.isObject(NOUN_STAGE_LEFT)) {
 			_vm->_dialogs->show(10422);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGE_RIGHT)) {
+		if (_action.isObject(NOUN_STAGE_RIGHT)) {
 			_vm->_dialogs->show(10423);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CHANDELIER)) {
+		if (_action.isObject(NOUN_CHANDELIER)) {
 			_vm->_dialogs->show(10428);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_MONSIEUR_RICHARD)) {
+		if (_action.isObject(NOUN_MONSIEUR_RICHARD)) {
 			_vm->_dialogs->show(10433);
 			_action._inProgress = false;
 			return;
@@ -4004,25 +4004,25 @@ void Scene105::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_FLOOR)) {
 			_vm->_dialogs->show(10512);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CIRCULAR_STAIRCASE)) {
+		if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) {
 			_vm->_dialogs->show(10513);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LANTERN) && _game._objects.isInRoom(OBJ_LANTERN)) {
+		if (_action.isObject(NOUN_LANTERN) && _game._objects.isInRoom(OBJ_LANTERN)) {
 			_vm->_dialogs->show(10514);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_RED_FRAME) && _game._objects.isInRoom(OBJ_RED_FRAME)){
+		if (_action.isObject(NOUN_RED_FRAME) && _game._objects.isInRoom(OBJ_RED_FRAME)){
 			if (_globals[kCurrentYear] == 1881)
 				_vm->_dialogs->show(10530);
 			else
@@ -4032,25 +4032,25 @@ void Scene105::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_DOOR)) {
+		if (_action.isObject(NOUN_DOOR)) {
 			_vm->_dialogs->show(10516);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(10517);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROP_TABLE)) {
+		if (_action.isObject(NOUN_PROP_TABLE)) {
 			_vm->_dialogs->show(10518);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BEAR_PROP)) {
+		if (_action.isObject(NOUN_BEAR_PROP)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(10519);
 			else
@@ -4060,13 +4060,13 @@ void Scene105::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_ELEPHANT_PROP)) {
+		if (_action.isObject(NOUN_ELEPHANT_PROP)) {
 			_vm->_dialogs->show(10520);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_COLUMN_PROP)) {
+		if (_action.isObject(NOUN_COLUMN_PROP)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(10521);
 			else
@@ -4076,7 +4076,7 @@ void Scene105::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_THUNDER_MACHINE)) {
+		if (_action.isObject(NOUN_THUNDER_MACHINE)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(10522);
 			else
@@ -4086,55 +4086,55 @@ void Scene105::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAIR_UNIT)) {
+		if (_action.isObject(NOUN_STAIR_UNIT)) {
 			_vm->_dialogs->show(10523);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROP)) {
+		if (_action.isObject(NOUN_PROP)) {
 			_vm->_dialogs->show(10524);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROPS)) {
+		if (_action.isObject(NOUN_PROPS)) {
 			_vm->_dialogs->show(10525);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_EXIT_SIGN)) {
+		if (_action.isObject(NOUN_EXIT_SIGN)) {
 			_vm->_dialogs->show(10526);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_FLATS)) {
+		if (_action.isObject(NOUN_FLATS)) {
 			_vm->_dialogs->show(10527);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_HEMP)) {
+		if (_action.isObject(NOUN_HEMP)) {
 			_vm->_dialogs->show(10528);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PIPE)) {
+		if (_action.isObject(NOUN_PIPE)) {
 			_vm->_dialogs->show(10529);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_GRAFFITI)) {
+		if (_action.isObject(NOUN_GRAFFITI)) {
 			_vm->_dialogs->show(10531);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+		if (_action.isObject(NOUN_LIGHT_FIXTURE)) {
 			_vm->_dialogs->show(10535);
 			_action._inProgress = false;
 			return;
@@ -4580,49 +4580,49 @@ void Scene106::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_STAGE_RIGHT_WING)) {
+		if (_action.isObject(NOUN_STAGE_RIGHT_WING)) {
 			_vm->_dialogs->show(10611);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGE_LEFT_WING)) {
+		if (_action.isObject(NOUN_STAGE_LEFT_WING)) {
 			_vm->_dialogs->show(10612);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_IN_TWO)) {
+		if (_action.isObject(NOUN_IN_TWO)) {
 			_vm->_dialogs->show(10613);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CYCLORAMA)) {
+		if (_action.isObject(NOUN_CYCLORAMA)) {
 			_vm->_dialogs->show(10614);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGE)) {
+		if (_action.isObject(NOUN_STAGE)) {
 			_vm->_dialogs->show(10615);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PEDESTAL)) {
+		if (_action.isObject(NOUN_PEDESTAL)) {
 			_vm->_dialogs->show(10616);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PLANT_PROP)) {
+		if (_action.isObject(NOUN_PLANT_PROP)) {
 			_vm->_dialogs->show(10617);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_SANDBAG)) {
+		if (_action.isObject(NOUN_SANDBAG)) {
 			if (_scene->_customDest.y < 60) {
 				_vm->_dialogs->show(10618);
 				_action._inProgress = false;
@@ -4634,49 +4634,49 @@ void Scene106::actions() {
 			}
 		}
 
-		if (_action.isAction(NOUN_STATUE)) {
+		if (_action.isObject(NOUN_STATUE)) {
 			_vm->_dialogs->show(10619);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CIRCULAR_STAIRCASE)) {
+		if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) {
 			_vm->_dialogs->show(10620);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BATTEN)) {
+		if (_action.isObject(NOUN_BATTEN)) {
 			_vm->_dialogs->show(10621);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DOOR)) {
+		if (_action.isObject(NOUN_DOOR)) {
 			_vm->_dialogs->show(10622);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BOXES) || _action.isAction(NOUN_BOX)) {
+		if (_action.isObject(NOUN_BOXES) || _action.isObject(NOUN_BOX)) {
 			_vm->_dialogs->show(10623);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BIG_PROP)) {
+		if (_action.isObject(NOUN_BIG_PROP)) {
 			_vm->_dialogs->show(10624);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CRATE)) {
+		if (_action.isObject(NOUN_CRATE)) {
 			_vm->_dialogs->show(10625);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CASE)) {
+		if (_action.isObject(NOUN_CASE)) {
 			if (_globals[kCurrentYear] == 1881)
 				_vm->_dialogs->show(10638);
 			else
@@ -4686,31 +4686,31 @@ void Scene106::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_VENTILATION_DUCT)) {
+		if (_action.isObject(NOUN_VENTILATION_DUCT)) {
 			_vm->_dialogs->show(10626);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_JUNK)) {
+		if (_action.isObject(NOUN_JUNK)) {
 			_vm->_dialogs->show(10627);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_FLATS)) {
+		if (_action.isObject(NOUN_FLATS)) {
 			_vm->_dialogs->show(10628);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(10629);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CABLE_HOOK) && _game._objects.isInRoom(OBJ_CABLE_HOOK)) {
+		if (_action.isObject(NOUN_CABLE_HOOK) && _game._objects.isInRoom(OBJ_CABLE_HOOK)) {
 			_vm->_dialogs->show(10639);
 			_action._inProgress = false;
 			return;
@@ -4873,97 +4873,97 @@ void Scene107::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_STAGE)) {
+		if (_action.isObject(NOUN_STAGE)) {
 			_vm->_dialogs->show(10711);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_IN_TWO)) {
+		if (_action.isObject(NOUN_IN_TWO)) {
 			_vm->_dialogs->show(10712);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_IN_ONE)) {
+		if (_action.isObject(NOUN_IN_ONE)) {
 			_vm->_dialogs->show(10713);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CYCLORAMA)) {
+		if (_action.isObject(NOUN_CYCLORAMA)) {
 			_vm->_dialogs->show(10714);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_COUNTERWEIGHT_SYSTEM)) {
+		if (_action.isObject(NOUN_COUNTERWEIGHT_SYSTEM)) {
 			_vm->_dialogs->show(10715);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PURCHASE_LINES)) {
+		if (_action.isObject(NOUN_PURCHASE_LINES)) {
 			_vm->_dialogs->show(10716);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LOCKRAIL)) {
+		if (_action.isObject(NOUN_LOCKRAIL)) {
 			_vm->_dialogs->show(10717);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGE)) {
+		if (_action.isObject(NOUN_STAGE)) {
 			_vm->_dialogs->show(10718);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROP_TABLE)) {
+		if (_action.isObject(NOUN_PROP_TABLE)) {
 			_vm->_dialogs->show(10719);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_ACT_CURTAIN)) {
+		if (_action.isObject(NOUN_ACT_CURTAIN)) {
 			_vm->_dialogs->show(10720);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LEG)) {
+		if (_action.isObject(NOUN_LEG)) {
 			_vm->_dialogs->show(10721);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_APRON)) {
+		if (_action.isObject(NOUN_APRON)) {
 			_vm->_dialogs->show(10722);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROSCENIUM_ARCH)) {
+		if (_action.isObject(NOUN_PROSCENIUM_ARCH)) {
 			_vm->_dialogs->show(10723);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGE)) {
+		if (_action.isObject(NOUN_STAGE)) {
 			_vm->_dialogs->show(10724);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BACKSTAGE)) {
+		if (_action.isObject(NOUN_BACKSTAGE)) {
 			_vm->_dialogs->show(10725);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_YELLOW_FRAME) && _game._objects.isInRoom(OBJ_YELLOW_FRAME)) {
+		if (_action.isObject(NOUN_YELLOW_FRAME) && _game._objects.isInRoom(OBJ_YELLOW_FRAME)) {
 			if (_globals[kCurrentYear] == 1881)
 				_vm->_dialogs->show(10727);
 			else
@@ -4973,13 +4973,13 @@ void Scene107::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_HEADSET)) {
+		if (_action.isObject(NOUN_HEADSET)) {
 			_vm->_dialogs->show(10728);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(10730);
 			_action._inProgress = false;
 			return;
@@ -5167,61 +5167,61 @@ void Scene108::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(10730);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGE)) {
+		if (_action.isObject(NOUN_STAGE)) {
 			_vm->_dialogs->show(10811);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_IN_TWO)) {
+		if (_action.isObject(NOUN_IN_TWO)) {
 			_vm->_dialogs->show(10812);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_IN_ONE)) {
+		if (_action.isObject(NOUN_IN_ONE)) {
 			_vm->_dialogs->show(10813);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PROSCENIUM_ARCH)) {
+		if (_action.isObject(NOUN_PROSCENIUM_ARCH)) {
 			_vm->_dialogs->show(10814);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_ACT_CURTAIN)) {
+		if (_action.isObject(NOUN_ACT_CURTAIN)) {
 			_vm->_dialogs->show(10815);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LEG)) {
+		if (_action.isObject(NOUN_LEG)) {
 			_vm->_dialogs->show(10816);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CYCLORAMA)) {
+		if (_action.isObject(NOUN_CYCLORAMA)) {
 			_vm->_dialogs->show(10817);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_FLATS)) {
+		if (_action.isObject(NOUN_FLATS)) {
 			_vm->_dialogs->show(10818);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGEMANAGERS_POST)) {
+		if (_action.isObject(NOUN_STAGEMANAGERS_POST)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(10819);
 			else
@@ -5231,37 +5231,37 @@ void Scene108::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_STOOL)) {
+		if (_action.isObject(NOUN_STOOL)) {
 			_vm->_dialogs->show(10821);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BACKSTAGE)) {
+		if (_action.isObject(NOUN_BACKSTAGE)) {
 			_vm->_dialogs->show(10822);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAGE)) {
+		if (_action.isObject(NOUN_STAGE)) {
 			_vm->_dialogs->show(10823);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_HEADSET)) {
+		if (_action.isObject(NOUN_HEADSET)) {
 			_vm->_dialogs->show(10824);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(10826);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CHARLES) || _action.isAction(NOUN_GENTLEMAN)) {
+		if (_action.isObject(NOUN_CHARLES) || _action.isObject(NOUN_GENTLEMAN)) {
 			_vm->_dialogs->show(10827);
 			_action._inProgress = false;
 			return;
@@ -6016,7 +6016,7 @@ void Scene109::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_STAIRCASE)) {
+		if (_action.isObject(NOUN_STAIRCASE)) {
 			if (_currentFloor == 1)
 				_vm->_dialogs->show(10911);
 			else if (_currentFloor == 2)
@@ -6028,55 +6028,55 @@ void Scene109::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_FLOOR)) {
 			_vm->_dialogs->show(10912);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BACKSTAGE)) {
+		if (_action.isObject(NOUN_BACKSTAGE)) {
 			_vm->_dialogs->show(10913);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DOOR)) {
+		if (_action.isObject(NOUN_DOOR)) {
 			_vm->_dialogs->show(10914);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_RAILING)) {
+		if (_action.isObject(NOUN_RAILING)) {
 			_vm->_dialogs->show(10915);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(10916);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+		if (_action.isObject(NOUN_LIGHT_FIXTURE)) {
 			_vm->_dialogs->show(10917);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LAMP)) {
+		if (_action.isObject(NOUN_LAMP)) {
 			_vm->_dialogs->show(10918);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_HOLE)) {
+		if (_action.isObject(NOUN_HOLE)) {
 			_vm->_dialogs->show(10919);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CEILING)) {
+		if (_action.isObject(NOUN_CEILING)) {
 			_vm->_dialogs->show(10920);
 			_action._inProgress = false;
 			return;
@@ -6317,31 +6317,31 @@ void Scene110::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_FLOOR)) {
 			_vm->_dialogs->show(11011);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(11012);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CEILING)) {
+		if (_action.isObject(NOUN_CEILING)) {
 			_vm->_dialogs->show(11013);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAIRWELL)) {
+		if (_action.isObject(NOUN_STAIRWELL)) {
 			_vm->_dialogs->show(11014);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_RIGHT_DOOR)) {
+		if (_action.isObject(NOUN_RIGHT_DOOR)) {
 			if (_globals[kDoneBrieConv203] >= 1)
 				_vm->_dialogs->show(11016);
 			else if (_globals[kChrisFStatus] == 1)
@@ -6353,31 +6353,31 @@ void Scene110::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_LEFT_DOOR)) {
+		if (_action.isObject(NOUN_LEFT_DOOR)) {
 			_vm->_dialogs->show(11016);
 			_action._inProgress = false;
 			return;
 		}
 
-		if ((_action.isAction(NOUN_WASTE_BASKET)) || (_action.isAction(NOUN_TRASH_BUCKET))) {
+		if ((_action.isObject(NOUN_WASTE_BASKET)) || (_action.isObject(NOUN_TRASH_BUCKET))) {
 			_vm->_dialogs->show(11017);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_POSTER)) {
+		if (_action.isObject(NOUN_POSTER)) {
 			_vm->_dialogs->show(11018);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BULLETIN_BOARD)) {
+		if (_action.isObject(NOUN_BULLETIN_BOARD)) {
 			_vm->_dialogs->show(11019);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PAPER)) {
+		if (_action.isObject(NOUN_PAPER)) {
 			_vm->_dialogs->show(11029);
 			_action._inProgress = false;
 			return;
@@ -6389,7 +6389,7 @@ void Scene110::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+		if (_action.isObject(NOUN_LIGHT_FIXTURE)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(11021);
 			else
@@ -6807,85 +6807,85 @@ void Scene111::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_FLOOR)) {
 			_vm->_dialogs->show(11112);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(11113);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CEILING)) {
+		if (_action.isObject(NOUN_CEILING)) {
 			_vm->_dialogs->show(11114);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_STAIRWELL)) {
+		if (_action.isObject(NOUN_STAIRWELL)) {
 			_vm->_dialogs->show(11115);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_TABLE)) {
+		if (_action.isObject(NOUN_TABLE)) {
 			_vm->_dialogs->show(11118);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PLANT)) {
+		if (_action.isObject(NOUN_PLANT)) {
 			_vm->_dialogs->show(11119);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_FIRE_AXE)) {
+		if (_action.isObject(NOUN_FIRE_AXE)) {
 			_vm->_dialogs->show(11120);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_HANDLE)) {
+		if (_action.isObject(NOUN_HANDLE)) {
 			_vm->_dialogs->show(11121);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_AXE)) {
+		if (_action.isObject(NOUN_AXE)) {
 			_vm->_dialogs->show(11122);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DOOR_CHUNKS)) {
+		if (_action.isObject(NOUN_DOOR_CHUNKS)) {
 			_vm->_dialogs->show(11129);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LIGHT)) {
+		if (_action.isObject(NOUN_LIGHT)) {
 			_vm->_dialogs->show(11131);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LAMP)) {
+		if (_action.isObject(NOUN_LAMP)) {
 			_vm->_dialogs->show(11132);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_HOOK)) {
+		if (_action.isObject(NOUN_HOOK)) {
 			_vm->_dialogs->show(11141);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LEFT_DOOR)) {
+		if (_action.isObject(NOUN_LEFT_DOOR)) {
 			if (_globals[kJacquesStatus])
 				_vm->_dialogs->show(11140);
 			else if (_globals[kChristineDoorStatus] == 2)
@@ -6900,7 +6900,7 @@ void Scene111::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_RIGHT_DOOR)) {
+		if (_action.isObject(NOUN_RIGHT_DOOR)) {
 			_vm->_dialogs->show(11117);
 			_action._inProgress = false;
 			return;
@@ -7113,145 +7113,145 @@ void Scene112::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(11211);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_FLOOR)) {
 			_vm->_dialogs->show(11212);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_MIRROR)) {
+		if (_action.isObject(NOUN_MIRROR)) {
 			_vm->_dialogs->show(11213);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_BALLET_BAR)) {
+		if (_action.isObject(NOUN_BALLET_BAR)) {
 			_vm->_dialogs->show(11214);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CORRIDOR)) {
+		if (_action.isObject(NOUN_CORRIDOR)) {
 			_vm->_dialogs->show(11215);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_THROW_RUGS)) {
+		if (_action.isObject(NOUN_THROW_RUGS)) {
 			_vm->_dialogs->show(11216);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DRESSING_SCREEN)) {
+		if (_action.isObject(NOUN_DRESSING_SCREEN)) {
 			_vm->_dialogs->show(11217);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DRESSING_TABLE)) {
+		if (_action.isObject(NOUN_DRESSING_TABLE)) {
 			_vm->_dialogs->show(11218);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CHAIR)) {
+		if (_action.isObject(NOUN_CHAIR)) {
 			_vm->_dialogs->show(11219);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PLANT)) {
+		if (_action.isObject(NOUN_PLANT)) {
 			_vm->_dialogs->show(11220);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_COAT_RACK)) {
+		if (_action.isObject(NOUN_COAT_RACK)) {
 			_vm->_dialogs->show(11221);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_UMBRELLA)) {
+		if (_action.isObject(NOUN_UMBRELLA)) {
 			_vm->_dialogs->show(11222);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PAINTINGS)) {
+		if (_action.isObject(NOUN_PAINTINGS)) {
 			_vm->_dialogs->show(11223);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_TRASH_BUCKET)) {
+		if (_action.isObject(NOUN_TRASH_BUCKET)) {
 			_vm->_dialogs->show(11224);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_SHELF)) {
+		if (_action.isObject(NOUN_SHELF)) {
 			_vm->_dialogs->show(11225);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CONTAINER)) {
+		if (_action.isObject(NOUN_CONTAINER)) {
 			_vm->_dialogs->show(11226);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_TORN_POSTER)) {
+		if (_action.isObject(NOUN_TORN_POSTER)) {
 			_vm->_dialogs->show(11227);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_POSTER)) {
+		if (_action.isObject(NOUN_POSTER)) {
 			_vm->_dialogs->show(11228);
 			_action._inProgress = false;
 			return;
 		}
 
-		if ((_action.isAction(NOUN_REVIEW)) || (_action.isAction(NOUN_REVIEWS))) {
+		if ((_action.isObject(NOUN_REVIEW)) || (_action.isObject(NOUN_REVIEWS))) {
 			_vm->_dialogs->show(11229);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_JULIE)) {
+		if (_action.isObject(NOUN_JULIE)) {
 			_vm->_dialogs->show(11231);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_COSTUME_RACK)) {
+		if (_action.isObject(NOUN_COSTUME_RACK)) {
 			_vm->_dialogs->show(11232);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+		if (_action.isObject(NOUN_LIGHT_FIXTURE)) {
 			_vm->_dialogs->show(11233);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WARDROBE)) {
+		if (_action.isObject(NOUN_WARDROBE)) {
 			_vm->_dialogs->show(11234);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WOMAN)) {
+		if (_action.isObject(NOUN_WOMAN)) {
 			_vm->_dialogs->show(11237);
 			_action._inProgress = false;
 			return;
@@ -7259,7 +7259,7 @@ void Scene112::actions() {
 	}
 
 	if (_action.isAction(VERB_TAKE)) {
-		if (_action.isAction(NOUN_WOMAN) || _action.isAction(NOUN_JULIE)) {
+		if (_action.isObject(NOUN_WOMAN) || _action.isObject(NOUN_JULIE)) {
 			_vm->_dialogs->show(11238);
 			_action._inProgress = false;
 			return;
@@ -8137,37 +8137,37 @@ void Scene113::actions() {
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
-		if (_action.isAction(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_FLOOR)) {
 			_vm->_dialogs->show(11312);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_RUG)) {
+		if (_action.isObject(NOUN_RUG)) {
 			_vm->_dialogs->show(11313);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WALL)) {
+		if (_action.isObject(NOUN_WALL)) {
 			_vm->_dialogs->show(11314);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_COUCH)) {
+		if (_action.isObject(NOUN_COUCH)) {
 			_vm->_dialogs->show(11315);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_MURAL)) {
+		if (_action.isObject(NOUN_MURAL)) {
 			_vm->_dialogs->show(11316);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_PAINTING)) {
+		if (_action.isObject(NOUN_PAINTING)) {
 			if (_globals[kCurrentYear] == 1881)
 				_vm->_dialogs->show(11317);
 			else
@@ -8176,25 +8176,25 @@ void Scene113::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_PAINTING)) {
+		if (_action.isObject(NOUN_PAINTING)) {
 			_vm->_dialogs->show(11317);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DRESSING_TABLE)) {
+		if (_action.isObject(NOUN_DRESSING_TABLE)) {
 			_vm->_dialogs->show(11318);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CHAIR)) {
+		if (_action.isObject(NOUN_CHAIR)) {
 			_vm->_dialogs->show(11319);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_MIRROR)) {
+		if (_action.isObject(NOUN_MIRROR)) {
 			if (_globals[kCurrentYear] == 1993) {
 				_vm->_dialogs->show(11344);
 			} else {
@@ -8204,85 +8204,85 @@ void Scene113::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_FAN)) {
+		if (_action.isObject(NOUN_FAN)) {
 			_vm->_dialogs->show(11321);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_VASE)) {
+		if (_action.isObject(NOUN_VASE)) {
 			_vm->_dialogs->show(11322);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_HAT_RACK)) {
+		if (_action.isObject(NOUN_HAT_RACK)) {
 			_vm->_dialogs->show(11323);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_LIGHT_FIXTURE)) {
+		if (_action.isObject(NOUN_LIGHT_FIXTURE)) {
 			_vm->_dialogs->show(11324);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CEILING)) {
+		if (_action.isObject(NOUN_CEILING)) {
 			_vm->_dialogs->show(11325);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_WARDROBE)) {
+		if (_action.isObject(NOUN_WARDROBE)) {
 			_vm->_dialogs->show(11326);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DRESSING_SCREEN)) {
+		if (_action.isObject(NOUN_DRESSING_SCREEN)) {
 			_vm->_dialogs->show(11327);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CORRIDOR)) {
+		if (_action.isObject(NOUN_CORRIDOR)) {
 			_vm->_dialogs->show(11328);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_DRESSING_GOWN)) {
+		if (_action.isObject(NOUN_DRESSING_GOWN)) {
 			_vm->_dialogs->show(11330);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_SMALL_NOTE) && _game._objects.isInRoom(OBJ_SMALL_NOTE)) {
+		if (_action.isObject(NOUN_SMALL_NOTE) && _game._objects.isInRoom(OBJ_SMALL_NOTE)) {
 			_vm->_dialogs->show(11349);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CHRISTINE) && _globals[kDoneBrieConv203]) {
+		if (_action.isObject(NOUN_CHRISTINE) && _globals[kDoneBrieConv203]) {
 			_vm->_dialogs->show(11338);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_JULIE)) {
+		if (_action.isObject(NOUN_JULIE)) {
 			_vm->_dialogs->show(11339);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_NOTICE)) {
+		if (_action.isObject(NOUN_NOTICE)) {
 			_vm->_dialogs->show(11347);
 			_action._inProgress = false;
 			return;
 		}
 
-		if (_action.isAction(NOUN_CLOTHES_DUMMY)) {
+		if (_action.isObject(NOUN_CLOTHES_DUMMY)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(11345);
 			else
@@ -8291,7 +8291,7 @@ void Scene113::actions() {
 			return;
 		}
 
-		if (_action.isAction(NOUN_WOMAN) || _action.isAction(NOUN_CHRISTINE)) {
+		if (_action.isObject(NOUN_WOMAN) || _action.isObject(NOUN_CHRISTINE)) {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(11341);
 			else {


Commit: 4e0b3ca04ba90832e7c56420025ea89ba0af86ba
    https://github.com/scummvm/scummvm/commit/4e0b3ca04ba90832e7c56420025ea89ba0af86ba
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-20T22:50:26+02:00

Commit Message:
MADS: Phantom: Implement scene 114

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index e961000..9ba7ca4 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -69,7 +69,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 113:	// inside dressing room 2
 		return new Scene113(vm);
 	case 114:	// lower floor, storage room
-		return new DummyScene(vm);	// TODO
+		return new Scene114(vm);
 	case 150:	// cutscene
 		return new DummyScene(vm);	// TODO
 
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index a705e7d..7db1616 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -9147,5 +9147,349 @@ void Scene113::handleLoveConversation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene114::Scene114(MADSEngine *vm) : Scene1xx(vm) {
+}
+
+void Scene114::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+}
+
+void Scene114::setup() {
+	if (_globals[kCurrentYear] == 1993)
+		_scene->_initialVariant = 1;
+
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene114::enter() {
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+	} else if (_game._objects.isInRoom(OBJ_ROPE) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9", false);
+	}
+
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+
+	if ((_game._objects.isInRoom(OBJ_ROPE)) && (_globals[kCurrentYear] == 1881) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+	} else
+		_scene->_hotspots.activate(NOUN_ROPE, false);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_scene->_hotspots.activate(NOUN_CYLINDER, false);
+		_scene->_hotspots.activate(NOUN_MANNEQUINS, false);
+		_scene->_hotspots.activate(NOUN_PROP, false);
+		_scene->_hotspots.activate(NOUN_BUST, false);
+		_scene->_hotspots.activate(NOUN_SCAFFOLDING, false);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+	} else {
+		_scene->_hotspots.activate(NOUN_BOXES, false);
+		_scene->_hotspots.activate(NOUN_DINETTE_SET, false);
+		_scene->_hotspots.activate(NOUN_CRATE, false);
+		_scene->_hotspots.activate(NOUN_CASES, false);
+	}
+
+	if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(218, 123);
+		_game._player._facing = FACING_WEST;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene114::step() {
+}
+
+void Scene114::actions() {
+	if (_action.isAction(VERB_CLIMB_UP, NOUN_CIRCULAR_STAIRCASE)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1);
+			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			break;
+
+		case 1:
+			_scene->_nextSceneId = 105;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_UP, NOUN_CIRCULAR_STAIRCASE)) {
+		_scene->_nextSceneId = 105;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_ROPE) && (_game._objects.isInRoom(OBJ_ROPE) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			_globals[kPlayerScore] += 5;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;  
+			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 6, 2);
+			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 3);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 3, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[2]);
+			_scene->_hotspots.activate(NOUN_ROPE, false);
+			_game._objects.addToInventory(OBJ_ROPE);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			_vm->_dialogs->showItem(OBJ_ROPE, 807, 0);
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(11410);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(11411);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) {
+			_vm->_dialogs->show(11412);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ROPE) && _game._objects.isInRoom(OBJ_ROPE)) {
+			_vm->_dialogs->show(11413);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(11414);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MANNEQUINS)) {
+			_vm->_dialogs->show(11415);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLAT)) {
+			_vm->_dialogs->show(11416);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SCAFFOLDING)) {
+			_vm->_dialogs->show(11417);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MUMMY_PROP)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11418);
+			else
+				_vm->_dialogs->show(11433);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CRATES)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11419);
+			else
+				_vm->_dialogs->show(11434);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CRATE)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11420);
+			else
+				_vm->_dialogs->show(11435);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CARTONS)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11421);
+			else
+				_vm->_dialogs->show(11436);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CARTON)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11422);
+			else
+				_vm->_dialogs->show(11437);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PROP)) {
+			_vm->_dialogs->show(11423);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BUST)) {
+			_vm->_dialogs->show(11424);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MUG)) {
+			_vm->_dialogs->show(11425);
+			_action._inProgress = false;
+			return;
+		}
+
+		if ((_action.isObject(NOUN_CASES)) || (_action.isObject(NOUN_CASE))) {
+			_vm->_dialogs->show(11426);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOXES) || _action.isObject(NOUN_BOX)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(11427);
+			else
+				_vm->_dialogs->show(11439);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOX)) {
+			if (_globals[kCurrentYear] == 1881) {
+				_vm->_dialogs->show(11439);
+				_action._inProgress = false;
+				return;
+			}
+		}
+
+		if (_action.isObject(NOUN_DINETTE_SET)) {
+			_vm->_dialogs->show(11428);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CYLINDER)) {
+			_vm->_dialogs->show(11429);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CARTONS)) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(11421);
+		else
+			_vm->_dialogs->show(11436);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CARTON)) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(11422);
+		else
+			_vm->_dialogs->show(11437);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CRATES)) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(11419);
+		else
+			_vm->_dialogs->show(11434);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CRATE)) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(11419);
+		else
+			_vm->_dialogs->show(11435);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CASES)) {
+		_vm->_dialogs->show(11426);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_BOXES) || _action.isAction(VERB_OPEN, NOUN_BOX)) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(11427);
+		else
+			_vm->_dialogs->show(11439);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_MUG)) {
+		_vm->_dialogs->show(11430);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_MUMMY_PROP)) {
+		_vm->_dialogs->show(11431);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_MUMMY_PROP)) {
+		_vm->_dialogs->show(11432);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene114::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 8a9ba84..252d393 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -391,6 +391,17 @@ public:
 	virtual void actions();
 };
 
+class Scene114 : public Scene1xx {
+public:
+	Scene114(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 0b046f848a984d072c70ebbeeb3eaa030f102a77
    https://github.com/scummvm/scummvm/commit/0b046f848a984d072c70ebbeeb3eaa030f102a77
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-21T10:21:08+02:00

Commit Message:
MADS: Phantom: Add scene 150

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 9ba7ca4..755a2ad 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -71,7 +71,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 114:	// lower floor, storage room
 		return new Scene114(vm);
 	case 150:	// cutscene
-		return new DummyScene(vm);	// TODO
+		return new Scene150(vm);
 
 	// Scene group #2 (theater entrance, offices, balcony)
 	case 201:	// entrance / ticket office
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 7db1616..a93be72 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -9491,5 +9491,70 @@ void Scene114::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene150::Scene150(MADSEngine *vm) : Scene1xx(vm) {
+}
+
+void Scene150::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+}
+
+void Scene150::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene150::enter() {
+	warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y");
+
+	_game._player._stepEnabled = false;
+	_game._player._visible = false;
+
+	if (_scene->_priorSceneId == 113)
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 1);
+	else if (_scene->_priorSceneId == 203) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('f', 1), 2);
+		sceneEntrySound();  
+	} else if (_scene->_priorSceneId == 306)
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('e', 1), 4);
+	else if (_scene->_priorSceneId == 208)
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('h', 1), 3);
+	else
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('q', 1), 5);
+}
+
+void Scene150::step() {
+	if (_game._trigger == 1)
+		_scene->_nextSceneId = 203;
+
+	if (_game._trigger == 2)
+		_scene->_nextSceneId = 111;
+
+	if (_game._trigger == 4)
+		_scene->_nextSceneId = 204;
+
+	if (_game._trigger == 3) {
+		_globals[kJacquesStatus] = 1;
+		_scene->_nextSceneId = 205;
+	}
+
+	if (_game._trigger == 5)
+		_game._winStatus = 1;
+
+	if (_scene->_nextSceneId != _scene->_currentSceneId) {
+		byte pal[768];
+		_vm->_palette->getFullPalette(pal);
+		Common::fill(&pal[12], &pal[756], 0);
+		_vm->_palette->setFullPalette(pal);
+	}
+}
+
+void Scene150::actions() {
+}
+
+void Scene150::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index 252d393..e2b4faa 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -402,6 +402,18 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene150 : public Scene1xx {
+public:
+	Scene150(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 52d035e96228a470fcc978d08ef9fb2b4ea5f500
    https://github.com/scummvm/scummvm/commit/52d035e96228a470fcc978d08ef9fb2b4ea5f500
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-21T18:48:13+02:00

Commit Message:
MADS: Phantom: Implement SequenceList::addStampCycle()

Changed paths:
    engines/mads/sequence.cpp
    engines/mads/sequence.h



diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index 61848c0..16e095a 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -551,8 +551,14 @@ void SequenceList::setMotion(int seqIndex, int flags, int deltaX, int deltaY) {
 }
 
 int SequenceList::addStampCycle(int srcSpriteIdx, bool flipped, int sprite) {
-	warning("TODO: SequenceList::addStampCycle");
-	return -1;
+	int id;
+
+	id = addSpriteCycle(srcSpriteIdx, flipped, 32767, 0, 0, 0);
+	if (id >= 0) {
+		setRange(id, sprite, sprite);
+		_entries[id]._animType = ANIMTYPE_STAMP;
+	}
+	return (id);
 }
 
 int SequenceList::setTimingTrigger(int delay, int code) {
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
index 900458e..ea479c4 100644
--- a/engines/mads/sequence.h
+++ b/engines/mads/sequence.h
@@ -38,7 +38,7 @@ enum SequenceTrigger {
 	SEQUENCE_TRIGGER_SPRITE = 2		// Trigger when sequence reaches specific sprite
 };
 
-enum SpriteAnimType { ANIMTYPE_NONE = 0, ANIMTYPE_CYCLED = 1, ANIMTYPE_PING_PONG = 2 };
+enum SpriteAnimType { ANIMTYPE_NONE = 0, ANIMTYPE_CYCLED = 1, ANIMTYPE_PING_PONG = 2, ANIMTYPE_STAMP = 9 };
 
 #define SEQUENCE_ENTRY_SUBSET_MAX 5
 


Commit: d7ba77cfe6bba1dc88bf6d87f7829e0dc302e748
    https://github.com/scummvm/scummvm/commit/d7ba77cfe6bba1dc88bf6d87f7829e0dc302e748
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-21T21:08:33+03:00

Commit Message:
MADS: Phantom: Implement loadSpeech() and playSpeech()

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/scene.cpp
    engines/mads/scene.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index a93be72..f9f97db 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -8021,7 +8021,6 @@ void Scene113::step() {
 			_game._objects.addToInventory(OBJ_SMALL_NOTE);
 			_scene->deleteSequence(_globals._sequenceIndexes[1]);
 			_vm->_sound->command(26);
-			_scene->_speechReady = -1;
 			_vm->_dialogs->showItem(OBJ_SMALL_NOTE, 806, 2);
 		}
 	}
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index ea5943c..34d9677 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -24,6 +24,7 @@
 #include "mads/scene.h"
 #include "mads/compression.h"
 #include "mads/mads.h"
+#include "mads/audio.h"
 #include "mads/dragonsphere/dragonsphere_scenes.h"
 #include "mads/nebular/nebular_scenes.h"
 #include "mads/phantom/phantom_scenes.h"
@@ -61,7 +62,6 @@ Scene::Scene(MADSEngine *vm)
 	_spritesCount = 0;
 	_variant = 0;
 	_initialVariant = 0;
-	_speechReady = -1;
 
 	_paletteUsageF.push_back(PaletteUsage::UsageEntry(0xF));
 
@@ -782,11 +782,14 @@ void Scene::deleteSequence(int idx) {
 }
 
 void Scene::loadSpeech(int idx) {
-	warning("TODO: Scene::loadSpeech");
+	_vm->_audio->setDefaultSoundGroup();
+	// NOTE: The original actually preloads the speech sample here, but the samples
+	// are so small that it's not really worth it...
 }
 
 void Scene::playSpeech(int idx) {
-	warning("TODO: Scene::playSpeech");
+	_vm->_audio->stop();
+	_vm->_audio->playSound(idx - 1);
 }
 
 void Scene::sceneScale(int front_y, int front_scale, int back_y,  int back_scale) {
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index f0b4326..b818a02 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -129,7 +129,6 @@ public:
 	Common::Point _customDest;
 	Common::Array<PaletteUsage::UsageEntry> _paletteUsageF;
 	Common::Array<PaletteUsage::UsageEntry> _scenePaletteUsage;
-	int _speechReady;
 	/**
 	 * Constructor
 	 */


Commit: d22a997cb24b501d19938d431c8764a4f965d6fd
    https://github.com/scummvm/scummvm/commit/d22a997cb24b501d19938d431c8764a4f965d6fd
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-21T20:17:57+02:00

Commit Message:
MADS: Get rid of SequenceList::setRange, use SequenceList::setAnimRange instead

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/sequence.cpp
    engines/mads/sequence.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index f9f97db..5b8abbd 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -1159,7 +1159,7 @@ void Scene103::step() {
 		_scene->deleteSequence(_globals._sequenceIndexes[1]);
 		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
-		_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 6);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 6);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
 		_vm->_sound->command(66);
 		break;
@@ -1188,7 +1188,7 @@ void Scene103::step() {
 		_scene->deleteSequence(_globals._sequenceIndexes[10]);
 		_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 101);
-		_scene->_sequences.setRange(_globals._sequenceIndexes[10], -1, -2);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], -1, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
 		break;
 
@@ -1214,7 +1214,7 @@ void Scene103::step() {
 				_scene->deleteSequence(_globals._sequenceIndexes[9]);
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[0], -1, -2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 105);
 			}
 		} else if (_anim2ActvFl) {
@@ -1225,7 +1225,7 @@ void Scene103::step() {
 				_scene->deleteSequence(_globals._sequenceIndexes[9]);
 				_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[0], -1, -2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 110);
 			}
 		}
@@ -1598,7 +1598,7 @@ void Scene103::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 2);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[2], -1, -2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 2, 3, 70);
@@ -1620,7 +1620,7 @@ void Scene103::actions() {
 				_scene->deleteSequence(_globals._sequenceIndexes[1]);
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[1], -1, -2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 71);
 				_vm->_sound->command(66);
 				break;
@@ -1642,7 +1642,7 @@ void Scene103::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 1);
 				break;
@@ -1660,7 +1660,7 @@ void Scene103::actions() {
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[2]);
 				_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 3);
 				break;
@@ -1690,7 +1690,7 @@ void Scene103::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 2);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[8], 1, 5);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
@@ -1752,7 +1752,7 @@ void Scene103::actions() {
 				_game._player._stepEnabled = false;
 				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 5);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[11], -1, -2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 1);
 				break;
 
@@ -1779,7 +1779,7 @@ void Scene103::actions() {
 				_game._player._stepEnabled = false;
 				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[10], -1, -2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], -1, -2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 1);
 				if (!_sitFl)
 					_game.syncTimers(1, _globals._sequenceIndexes[10], 3, _globals._animationIndexes[5]);
@@ -2692,7 +2692,7 @@ void Scene104::actions() {
 				_game._player._visible = false;
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 16);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 16);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
 				break;
 
@@ -2734,7 +2734,7 @@ void Scene104::actions() {
 			_game._player._stepEnabled = false;
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[3], -1, 4);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, 4);
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
@@ -2743,7 +2743,7 @@ void Scene104::actions() {
 		case 1:
 			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 1, 10);
 			_scene->_sequences.setTimingTrigger(60, 2);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[3], 4, 4);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 4);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
 			_scene->_sequences.setMotion(_globals._sequenceIndexes[3], 0, 0, 200);
@@ -3714,7 +3714,7 @@ void Scene105::step() {
 		_scene->deleteSequence(_globals._sequenceIndexes[2]);
 		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
-		_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 8);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 61);
 		_vm->_sound->command(66);
 		break;
@@ -3830,7 +3830,7 @@ void Scene105::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[5], 1, 5);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 5, 1);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 2);
@@ -3869,7 +3869,7 @@ void Scene105::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 2, 4, 1);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
@@ -3908,7 +3908,7 @@ void Scene105::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 2, 4, 65);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
@@ -3928,7 +3928,7 @@ void Scene105::actions() {
 				_scene->deleteSequence(_globals._sequenceIndexes[2]);
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 8);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
 				_vm->_sound->command(66);
 				break;
@@ -3951,7 +3951,7 @@ void Scene105::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], true, 5, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 1);
 				break;
@@ -3969,7 +3969,7 @@ void Scene105::actions() {
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[6]);
 				_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], true, 5, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[6], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 3);
 				break;
@@ -4305,7 +4305,7 @@ void Scene106::step() {
 		_scene->deleteSequence(_globals._sequenceIndexes[2]);
 		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
-		_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 5);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 61);
 		break;
 
@@ -4333,7 +4333,7 @@ void Scene106::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 2);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[5], 1, 5);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 5, 1);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 2);
@@ -4372,7 +4372,7 @@ void Scene106::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[5], 1, 5);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5],
 					2, 5, 1);
@@ -4478,7 +4478,7 @@ void Scene106::actions() {
 			case 0:
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 9);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 9);
 				_scene->_sequences.setTimingTrigger(6, 2);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
 				break;
@@ -4522,7 +4522,7 @@ void Scene106::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[3], 1, 4);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 4, 65);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 67);
@@ -4533,7 +4533,7 @@ void Scene106::actions() {
 			_scene->deleteSequence(_globals._sequenceIndexes[2]);
 			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[2], 1, 5);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
 			break;
 
@@ -4555,7 +4555,7 @@ void Scene106::actions() {
 			_scene->deleteSequence(_globals._sequenceIndexes[2]);
 			_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[2], -1, -2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 69);
 			break;
 
@@ -4831,7 +4831,7 @@ void Scene107::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 5);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
@@ -5729,7 +5729,7 @@ void Scene109::step() {
 		_scene->deleteSequence(_globals._sequenceIndexes[0]);
 		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
-		_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 3);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 3);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
 		break;
 
@@ -5747,7 +5747,7 @@ void Scene109::step() {
 		_scene->deleteSequence(_globals._sequenceIndexes[1]);
 		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
-		_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 3);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
 		break;
 
@@ -5947,7 +5947,7 @@ void Scene109::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[8], -1, -2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 4, 75);
@@ -5976,13 +5976,13 @@ void Scene109::actions() {
 			if (_currentFloor == 3) {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 3);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 3);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0],
 					0, 0, 76);
 			} else if (_currentFloor == 2) {
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 3);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1],
 					0, 0, 76);
 			}
@@ -6177,7 +6177,7 @@ void Scene110::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 1);
 			break;
@@ -6195,7 +6195,7 @@ void Scene110::actions() {
 		case 2:
 			_scene->deleteSequence(_globals._sequenceIndexes[1]);
 			_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
 			break;
@@ -6227,7 +6227,7 @@ void Scene110::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 1);
 				break;
@@ -6245,7 +6245,7 @@ void Scene110::actions() {
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[1]);
 				_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
 				break;
@@ -6271,7 +6271,7 @@ void Scene110::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 7, 2);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 4, 1);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
@@ -6280,7 +6280,7 @@ void Scene110::actions() {
 			case 1:
 				_vm->_sound->command(24);
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 10, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[2], -1, -2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
 				break;
@@ -6600,7 +6600,7 @@ void Scene111::step() {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 7, 1);
 		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 62);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
-		_scene->_sequences.setRange(_globals._sequenceIndexes[5], -1, -2);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
 		break;
 
 	case 62:
@@ -6653,7 +6653,7 @@ void Scene111::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
 			_action._inProgress = false;
@@ -6673,7 +6673,7 @@ void Scene111::actions() {
 		case 2:
 			_scene->deleteSequence(_globals._sequenceIndexes[0]);
 			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 3);
 			_action._inProgress = false;
@@ -6703,7 +6703,7 @@ void Scene111::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
 				_action._inProgress = false;
@@ -6723,7 +6723,7 @@ void Scene111::actions() {
 			case 2:
 				_scene->deleteSequence(_globals._sequenceIndexes[0]);
 				_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
-				_scene->_sequences.setRange(_globals._sequenceIndexes[0], 1, 4);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 3);
 				_action._inProgress = false;
@@ -9236,7 +9236,7 @@ void Scene114::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;  
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 6, 2);
-			_scene->_sequences.setRange(_globals._sequenceIndexes[1], 1, 3);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 3, 1);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index 16e095a..669f3c4 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -555,7 +555,7 @@ int SequenceList::addStampCycle(int srcSpriteIdx, bool flipped, int sprite) {
 
 	id = addSpriteCycle(srcSpriteIdx, flipped, 32767, 0, 0, 0);
 	if (id >= 0) {
-		setRange(id, sprite, sprite);
+		setAnimRange(id, sprite, sprite);
 		_entries[id]._animType = ANIMTYPE_STAMP;
 	}
 	return (id);
@@ -566,10 +566,6 @@ int SequenceList::setTimingTrigger(int delay, int code) {
 	return -1;
 }
 
-void SequenceList::setRange(int sequence_id, int first, int last) {
-	warning("TODO: SequenceList::setRange");
-}
-
 int SequenceList::setTrigger(int idx, int trigger_type, int trigger_sprite, int trigger_code) {
 	warning("TODO: SequenceList::setTrigger");
 	return -1;
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
index ea479c4..b207cc1 100644
--- a/engines/mads/sequence.h
+++ b/engines/mads/sequence.h
@@ -128,7 +128,6 @@ public:
 
 	int addStampCycle(int srcSpriteIdx, bool flipped, int sprite);
 	int setTimingTrigger(int delay, int code);
-	void setRange(int sequence_id, int first, int last);
 	int setTrigger(int sequence_id, int trigger_type, int trigger_sprite, int trigger_code);
 	void setSeqPlayer(int idx, bool flag);
 };


Commit: d12d110543f0ddd2883c721dad80fa5e39fa2f74
    https://github.com/scummvm/scummvm/commit/d12d110543f0ddd2883c721dad80fa5e39fa2f74
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-21T21:42:24+03:00

Commit Message:
MADS: Phantom: Increase maximum dynamic hotspots to 10, up from 8

Scene 105 in Phantom uses 9 dynamic hotspots

Changed paths:
    engines/mads/hotspots.h



diff --git a/engines/mads/hotspots.h b/engines/mads/hotspots.h
index faabd44..e556c29 100644
--- a/engines/mads/hotspots.h
+++ b/engines/mads/hotspots.h
@@ -54,7 +54,7 @@ public:
 	void synchronize(Common::Serializer &s);
 };
 
-#define DYNAMIC_HOTSPOTS_SIZE 8
+#define DYNAMIC_HOTSPOTS_SIZE 10
 
 #define SYNTAX_SINGULAR               0
 #define SYNTAX_PLURAL                 1


Commit: 51365c11ca5ac79d01601411e634bca34e4a97c4
    https://github.com/scummvm/scummvm/commit/51365c11ca5ac79d01601411e634bca34e4a97c4
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-21T21:42:25+03:00

Commit Message:
MADS: Phantom: Fix loadAnimation and silence warning in animations_tick

Changed paths:
    engines/mads/scene.cpp



diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 34d9677..07e67c0 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -618,15 +618,20 @@ int Scene::loadAnimation(const Common::String &resName, int trigger) {
 	DepthSurface depthSurface;
 	UserInterface interfaceSurface(_vm);
 
-	warning("TODO: Fix loadAnimation");
-	int id = 0;
+	for (int i = 0; i < 10; i++) {
+		if (!_animation[i]) {
+			_animation[i] = Animation::init(_vm, this);
+			_animation[i]->load(interfaceSurface, depthSurface, resName,
+				_vm->_dithering ? ANIMFLAG_DITHER : 0, nullptr, nullptr);
+			_animation[i]->startAnimation(trigger);
+
+			return i;
+		}
+	}
 
-	_animation[id] = Animation::init(_vm, this);
-	_animation[id]->load(interfaceSurface, depthSurface, resName,
-		_vm->_dithering ? ANIMFLAG_DITHER : 0, nullptr, nullptr);
-	_animation[id]->startAnimation(trigger);
+	error("Unable to find an available animation slot");
 
-	return id;
+	return -1;
 }
 
 void Scene::updateCursor() {
@@ -797,7 +802,7 @@ void Scene::sceneScale(int front_y, int front_scale, int back_y,  int back_scale
 }
 
 void Scene::animations_tick() {
-	warning("TODO: Implement _animations as an AnimationList and refactor (and check implementation)");
+	//warning("TODO: Implement _animations as an AnimationList and refactor (and check implementation)");
 	for (int i = 0; i < 10; i++) {
 		if (_animation[i])
 			_animation[i]->update();


Commit: e232c9fdb6f150c361c0a556f3245d9b503d2cbb
    https://github.com/scummvm/scummvm/commit/e232c9fdb6f150c361c0a556f3245d9b503d2cbb
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-21T23:42:33+03:00

Commit Message:
MADS: Phantom: Implement resetFacing()

Changed paths:
    engines/mads/player.cpp



diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index 01430b0..1e9ce7e 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -56,7 +56,6 @@ Player::Player(MADSEngine *vm)
 	_special = 0;
 	_ticksAmount = 0;
 	_priorTimer = 0;
-	_trigger = 0;
 	_scalingVelocity = false;
 	_spritesChanged = false;
 	_forceRefresh = false;
@@ -816,6 +815,9 @@ void Player::setWalkTrigger(int val) {
 }
 
 void Player::resetFacing(Facing facing) {
-	warning("TODO: Player::resetFacing");
+	_facing = facing;
+	_turnToFacing = facing;
+	selectSeries();
 }
+
 } // End of namespace MADS


Commit: 80dae7b8fcd3e20a0f18d9287a9fc44793f6c38a
    https://github.com/scummvm/scummvm/commit/80dae7b8fcd3e20a0f18d9287a9fc44793f6c38a
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-22T00:42:04+03:00

Commit Message:
MADS: Phantom: Initial work on hotspots with dynamic animations

Changed paths:
    engines/mads/animation.cpp
    engines/mads/animation.h
    engines/mads/hotspots.cpp
    engines/mads/hotspots.h
    engines/mads/scene.cpp



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index e4f44fc..1c492bb 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -177,6 +177,7 @@ Animation::Animation(MADSEngine *vm, Scene *scene) : _vm(vm), _scene(scene) {
 	_oldFrameEntry = 0;
 	_rgbResult = -1;
 	_palIndex1 = _palIndex2 = -1;
+	_dynamicHotspotIndex = -1;
 }
 
 Animation::~Animation() {
diff --git a/engines/mads/animation.h b/engines/mads/animation.h
index 46ef85c..45e6e3c 100644
--- a/engines/mads/animation.h
+++ b/engines/mads/animation.h
@@ -191,6 +191,7 @@ public:
 	bool _resetFlag;
 	int _currentFrame;
 	int _oldFrameEntry;
+	int _dynamicHotspotIndex;
 
 	static Animation *init(MADSEngine *vm, Scene *scene);
 	/*
diff --git a/engines/mads/hotspots.cpp b/engines/mads/hotspots.cpp
index 526654d..098313e 100644
--- a/engines/mads/hotspots.cpp
+++ b/engines/mads/hotspots.cpp
@@ -27,6 +27,7 @@ namespace MADS {
 
 DynamicHotspot::DynamicHotspot() {
 	_seqIndex = 0;
+	_animIndex = -1;
 	_facing = FACING_NONE;
 	_descId = 0;
 	_verbId = 0;
@@ -74,6 +75,7 @@ int DynamicHotspots::add(int descId, int verbId, int seqIndex, const Common::Rec
 	_entries[idx]._verbId = verbId;
 	_entries[idx]._articleNumber = PREP_IN;
 	_entries[idx]._cursor = CURSOR_NONE;
+	_entries[idx]._animIndex = -1;
 
 	++_count;
 	_changed = true;
@@ -106,6 +108,8 @@ void DynamicHotspots::remove(int index) {
 	if (index >= 0 && _entries[index]._active) {
 		if (_entries[index]._seqIndex >= 0)
 			scene._sequences[_entries[index]._seqIndex]._dynamicHotspotIndex = -1;
+		if (_entries[index]._animIndex >= 0)
+			scene._animation[_entries[index]._animIndex]->_dynamicHotspotIndex = -1;
 		_entries[index]._active = false;
 
 		--_count;
diff --git a/engines/mads/hotspots.h b/engines/mads/hotspots.h
index e556c29..ffd53e5 100644
--- a/engines/mads/hotspots.h
+++ b/engines/mads/hotspots.h
@@ -35,6 +35,7 @@ class DynamicHotspot {
 public:
 	bool _active;
 	int _seqIndex;
+	int _animIndex;
 	Common::Rect _bounds;
 	Common::Point _feetPos;
 	Facing _facing;
@@ -54,7 +55,7 @@ public:
 	void synchronize(Common::Serializer &s);
 };
 
-#define DYNAMIC_HOTSPOTS_SIZE 10
+#define DYNAMIC_HOTSPOTS_SIZE 16
 
 #define SYNTAX_SINGULAR               0
 #define SYNTAX_PLURAL                 1
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 07e67c0..daa50aa 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -771,7 +771,19 @@ int Scene::getAnimFrame(int id) {
 }
 
 void Scene::setDynamicAnim(int id, int anim_id, int segment) {
-	warning("TODO: Scene::setDynamicAnim");
+	if (id >= 0 && id <= DYNAMIC_HOTSPOTS_SIZE && _animation[anim_id]) {
+		_animation[anim_id]->_dynamicHotspotIndex = id;
+		if (_dynamicHotspots[id]._animIndex < 0)
+			_dynamicHotspots[id]._active = false;
+		_dynamicHotspots[id]._animIndex = anim_id;
+
+		// TODO: Anim segments
+
+		// NOTE: Only remove the TODO below when _dynamicHotspotIndex
+		// in the Animation class is actually used in the engine!
+
+		warning("TODO: Scene::setDynamicAnim");
+	}
 }
 
 void Scene::setCamera(Common::Point pos) {


Commit: 9bfa51ef300cf95872ca2325b7bd0d64f85372e6
    https://github.com/scummvm/scummvm/commit/9bfa51ef300cf95872ca2325b7bd0d64f85372e6
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-22T02:14:41+03:00

Commit Message:
MADS: Phantom: Expand the existing camera adjustment logic for V2 games

This fixes all of the scenes that expand over the screen (e.g. 101, 104,
109 in Phantom, as well as the several scenes in the Dragonsphere intro).

Also added a new debugger command, "set_camera", which sets the scene
camera to specific coordinates

Changed paths:
    engines/mads/debugger.cpp
    engines/mads/debugger.h
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/scene.cpp
    engines/mads/scene_data.cpp



diff --git a/engines/mads/debugger.cpp b/engines/mads/debugger.cpp
index a6a4d3e..740c19a 100644
--- a/engines/mads/debugger.cpp
+++ b/engines/mads/debugger.cpp
@@ -49,6 +49,7 @@ Debugger::Debugger(MADSEngine *vm) : GUI::Debugger(), _vm(vm) {
 	registerCmd("item", WRAP_METHOD(Debugger, Cmd_Item));
 	registerCmd("play_anim", WRAP_METHOD(Debugger, Cmd_PlayAnim));
 	registerCmd("play_text", WRAP_METHOD(Debugger, Cmd_PlayText));
+	registerCmd("set_camera", WRAP_METHOD(Debugger, Cmd_SetCamera));
 }
 
 static int strToInt(const char *s) {
@@ -391,4 +392,17 @@ bool Debugger::Cmd_PlayText(int argc, const char **argv) {
 	}
 }
 
+bool Debugger::Cmd_SetCamera(int argc, const char **argv) {
+	if (argc != 3) {
+		debugPrintf("Usage: %s <x> <y>\n", argv[0]);
+		return true;
+	} else {
+		int x = strToInt(argv[1]);
+		int y = strToInt(argv[2]);
+		_vm->_game->_scene.setCamera(Common::Point(x, y));
+		_vm->_game->_scene.resetScene();
+		_vm->_game->_scene.drawElements(kTransitionNone, false);
+		return false;
+	}
+}
 } // End of namespace MADS
diff --git a/engines/mads/debugger.h b/engines/mads/debugger.h
index 70b2cad..f6b58ac 100644
--- a/engines/mads/debugger.h
+++ b/engines/mads/debugger.h
@@ -51,6 +51,7 @@ protected:
 	bool Cmd_Item(int argc, const char **argv);
 	bool Cmd_PlayAnim(int argc, const char **argv);
 	bool Cmd_PlayText(int argc, const char **argv);
+	bool Cmd_SetCamera(int argc, const char **argv);
 public:
 	bool _showMousePos;
 public:
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 5b8abbd..0b6f4af 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -254,8 +254,7 @@ void Scene101::step() {
 		}
 	}
 
-	if (!_startSittingFl && (_globals[kBrieTalkStatus] != 2)) {
-		warning("TODO: Add a check on view port x > 200");
+	if (_scene->_posAdjust.x > 200 && !_startSittingFl && (_globals[kBrieTalkStatus] != 2)) {
 		_startSittingFl = true;
 		_game._player.walk(Common::Point(490, 119), FACING_NORTHEAST);
 		_game._player._stepEnabled = false;
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index daa50aa..9fe601e 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -153,6 +153,7 @@ void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) {
 	_sequences.clear();
 	_kernelMessages.clear();
 	_vm->_palette->_paletteUsage.load(&_scenePaletteUsage);
+	setCamera(Common::Point(0, 0));
 
 	int flags = SCENEFLAG_LOAD_SHADOW;
 	if (_vm->_dithering)
@@ -787,7 +788,7 @@ void Scene::setDynamicAnim(int id, int anim_id, int segment) {
 }
 
 void Scene::setCamera(Common::Point pos) {
-	warning("TODO: Scene::setCamera");
+	_posAdjust = pos;
 }
 
 void Scene::drawToBackground(int series_id, int sprite_id, Common::Point pos, int depth, int scale) {
diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp
index e48bcd8..d4610c5 100644
--- a/engines/mads/scene_data.cpp
+++ b/engines/mads/scene_data.cpp
@@ -422,6 +422,18 @@ void SceneInfo::loadMadsV2Background(int sceneId, const Common::String &resName,
 	assert(screenWidth == _width);
 	assert(screenHeight <= _height);
 
+	// Resize the background surface to hold all of the tiles
+	uint16 newWidth = bgSurface.w;
+	uint16 newHeight = bgSurface.h;
+
+	if (tileWidth < screenWidth && bgSurface.w != tileCount * tileWidth)
+		newWidth = tileCount * tileWidth;
+	if (tileHeight < screenHeight && bgSurface.h != tileCount * tileHeight)
+		newHeight = tileCount * tileHeight;
+
+	if (bgSurface.w != newWidth || bgSurface.h != newHeight)
+		bgSurface.setSize(newWidth, newHeight);
+
 	// --------------------------------------------------------------------------------
 
 	// Get tile data


Commit: fac601ae2ec7efea502d4c75e8f2941ab7ca1c46
    https://github.com/scummvm/scummvm/commit/fac601ae2ec7efea502d4c75e8f2941ab7ca1c46
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-22T03:21:54+03:00

Commit Message:
MADS: Fix typo

Changed paths:
    engines/mads/sequence.cpp



diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index 669f3c4..52d5d12 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -259,7 +259,7 @@ bool SequenceList::loadSprites(int seqIndex) {
 			}
 
 			if (seqEntry._flags & 2) {
-				// Check for object having moved off-scren
+				// Check for object having moved off-screen
 				if ((pt.x + width) < 0 || (pt.x + width) >= MADS_SCREEN_WIDTH ||
 						pt.y < 0 || (pt.y - height) >= MADS_SCENE_HEIGHT) {
 					result = true;


Commit: 51d5f6c2b843760615e262f51d1791d9bf10bdf8
    https://github.com/scummvm/scummvm/commit/51d5f6c2b843760615e262f51d1791d9bf10bdf8
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-22T03:23:08+03:00

Commit Message:
MADS: Phantom: Implement deleteSequence()

I've left in a CHECKME for the part of the code I'm not 100% sure.
Unfortunately, this can't really be tested yet until animations
work properly

Changed paths:
    engines/mads/scene.cpp



diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 9fe601e..6101be6 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -796,7 +796,15 @@ void Scene::drawToBackground(int series_id, int sprite_id, Common::Point pos, in
 }
 
 void Scene::deleteSequence(int idx) {
-	warning("TODO: Scene::deleteSequence");
+	if (_sequences[idx]._active && _sequences[idx]._dynamicHotspotIndex >= 0)
+		_dynamicHotspots.remove(_sequences[idx]._dynamicHotspotIndex);
+
+	_sequences[idx]._active = false;
+
+	if (!_sequences[idx]._doneFlag)
+		doFrame();	// FIXME/CHECKME: Is this correct?
+	else
+		_sequences.remove(idx);
 }
 
 void Scene::loadSpeech(int idx) {


Commit: a2bd9b524e1d95cde7d4c5ba3ee7a1bd8bdcc084
    https://github.com/scummvm/scummvm/commit/a2bd9b524e1d95cde7d4c5ba3ee7a1bd8bdcc084
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-22T03:23:52+03:00

Commit Message:
MADS: Phantom: Better checking for scene codes

This allows scene 150 to start

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 755a2ad..4f87e40 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -170,12 +170,12 @@ Common::String PhantomScene::formAnimName(char sepChar, int suffixNum) {
 /*------------------------------------------------------------------------*/
 
 void SceneInfoPhantom::loadCodes(MSurface &depthSurface, int variant) {
-	// The intro scenes do not have any codes
-	if (_sceneId >= 900)
+	Common::String ext = Common::String::format(".WW%d", variant);
+	Common::String fileName = Resources::formatName(RESPREFIX_RM, _sceneId, ext);
+	if (!Common::File::exists(fileName))
 		return;
 
-	Common::String ext = Common::String::format(".WW%d", variant);
-	File f(Resources::formatName(RESPREFIX_RM, _sceneId, ext));
+	File f(fileName);
 	MadsPack codesPack(&f);
 	Common::SeekableReadStream *stream = codesPack.getItemStream(0);
 


Commit: 6a14396d73bafa2047214c21b3a284b2a647d560
    https://github.com/scummvm/scummvm/commit/6a14396d73bafa2047214c21b3a284b2a647d560
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-22T03:24:14+03:00

Commit Message:
MADS: Dragon: Better checking for scene codes

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes.cpp



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
index 6f5a28b..c24d0e9 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
@@ -201,12 +201,12 @@ Common::String DragonsphereScene::formAnimName(char sepChar, int suffixNum) {
 /*------------------------------------------------------------------------*/
 
 void SceneInfoDragonsphere::loadCodes(MSurface &depthSurface, int variant) {
-	// The intro scenes do not have any codes
-	if (_sceneId >= 900)
+	Common::String ext = Common::String::format(".WW%d", variant);
+	Common::String fileName = Resources::formatName(RESPREFIX_RM, _sceneId, ext);
+	if (!Common::File::exists(fileName))
 		return;
 
-	Common::String ext = Common::String::format(".WW%d", variant);
-	File f(Resources::formatName(RESPREFIX_RM, _sceneId, ext));
+	File f(fileName);
 	MadsPack codesPack(&f);
 	Common::SeekableReadStream *stream = codesPack.getItemStream(0);
 


Commit: 5e6dbbef4c12bc6a0bb3432aeb41506b592bbd19
    https://github.com/scummvm/scummvm/commit/5e6dbbef4c12bc6a0bb3432aeb41506b592bbd19
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-22T15:15:57+02:00

Commit Message:
MADS: Phantom: Add Scene Group 2 generic functions

Changed paths:
  A engines/mads/phantom/phantom_scenes2.cpp
  A engines/mads/phantom/phantom_scenes2.h
    engines/mads/module.mk
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 9c79068..3bd9ef5 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -7,6 +7,7 @@ MODULE_OBJS := \
 	phantom/globals_phantom.o \
 	phantom/phantom_scenes.o \
 	phantom/phantom_scenes1.o \
+	phantom/phantom_scenes2.o \
 	nebular/dialogs_nebular.o \
 	nebular/game_nebular.o \
 	nebular/globals_nebular.o \
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 4f87e40..162eaa0 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -29,6 +29,7 @@
 #include "mads/phantom/game_phantom.h"
 #include "mads/phantom/phantom_scenes.h"
 #include "mads/phantom/phantom_scenes1.h"
+#include "mads/phantom/phantom_scenes2.h"
 
 namespace MADS {
 
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
new file mode 100644
index 0000000..b4a8248
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -0,0 +1,79 @@
+/* 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/scummsys.h"
+#include "mads/mads.h"
+#include "mads/conversations.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+#include "mads/phantom/phantom_scenes2.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+void Scene2xx::setAAName() {
+	_game._aaName = Resources::formatAAName(_globals[kTempInterface]);
+	_vm->_palette->setEntry(254, 43, 47, 51);
+}
+
+void Scene2xx::sceneEntrySound() {
+	if (!_vm->_musicFlag)
+		return;
+
+	switch (_scene->_nextSceneId) {
+	case 206:
+		if (!_globals[kKnockedOverHead])
+			_vm->_sound->command(16);
+		break;
+
+	case 208:
+		_vm->_sound->command(34);
+		break;
+
+	default:
+		if (_scene->_nextSceneId != 250)
+			_vm->_sound->command(16);
+		break;
+	}
+}
+
+void Scene2xx::setPlayerSpritesPrefix() {
+	_vm->_sound->command(5);
+
+	if (_scene->_nextSceneId == 208)
+		_game._player._spritesPrefix = "";
+	else {
+		Common::String oldName = _game._player._spritesPrefix;
+		if (!_game._player._forcePrefix)
+			_game._player._spritesPrefix = "RAL";
+		if (oldName != _game._player._spritesPrefix)
+			_game._player._spritesChanged = true;
+	}
+
+	_game._player._scalingVelocity = true;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Phantom
+} // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
new file mode 100644
index 0000000..9ecd7b4
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes2.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 MADS_PHANTOM_SCENES2_H
+#define MADS_PHANTOM_SCENES2_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+class Scene2xx : public PhantomScene {
+protected:
+	/**
+	 * Plays an appropriate sound when entering a scene
+	 */
+	void sceneEntrySound();
+
+	/**
+	 *Sets the AA file to use for the scene
+	 */
+	void setAAName();
+
+	/**
+	 * Updates the prefix used for getting player sprites for the scene
+	 */
+	void setPlayerSpritesPrefix();
+public:
+	Scene2xx(MADSEngine *vm) : PhantomScene(vm) {}
+};
+
+} // End of namespace Phantom
+} // End of namespace MADS
+
+#endif /* MADS_PHANTOM_SCENES2_H */


Commit: cbbfeb017109c0bebffe05f52ce6360af99e8027
    https://github.com/scummvm/scummvm/commit/cbbfeb017109c0bebffe05f52ce6360af99e8027
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-22T17:11:02+02:00

Commit Message:
MADS: Phantom: Implement scene 201

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 162eaa0..a9ae84e 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -76,7 +76,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 
 	// Scene group #2 (theater entrance, offices, balcony)
 	case 201:	// entrance / ticket office
-		return new DummyScene(vm);	// TODO
+		return new Scene201(vm);
 	case 202:	// outside offices / paintings room
 		return new DummyScene(vm);	// TODO
 	case 203:	// office
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index b4a8248..eac175c 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -75,5 +75,503 @@ void Scene2xx::setPlayerSpritesPrefix() {
 
 /*------------------------------------------------------------------------*/
 
+Scene201::Scene201(MADSEngine *vm) : Scene2xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_needHoldFl = false;
+	_sellerCount = -1;
+	_sellerStatus = -1;
+	_sellerFrame = -1;
+	_raoulFrame = -1;
+	_raoulStatus = -1;
+}
+
+void Scene201::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_needHoldFl);
+	s.syncAsSint16LE(_sellerCount);
+	s.syncAsSint16LE(_sellerStatus);
+	s.syncAsSint16LE(_sellerFrame);
+	s.syncAsSint16LE(_raoulFrame);
+	s.syncAsSint16LE(_raoulStatus);
+}
+
+void Scene201::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene201::enter() {
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+	}
+
+	_sellerCount = 0;
+	_needHoldFl = false;
+
+	_vm->_gameConv->get(16);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+
+	if (_globals[kTicketPeoplePresent]) {
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('s', 1), 0);
+		_anim1ActvFl = true;
+		_sellerStatus = 2;
+		_scene->setAnimFrame(_globals._animationIndexes[1], 5);
+	} else {
+		_scene->_hotspots.activate(NOUN_TICKET_SELLER, false);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	}
+
+	if (_vm->_gameConv->_restoreRunning == 16) {
+		_game._player._playerPos = Common::Point(72, 101);
+		_game._player._facing = FACING_NORTHWEST;
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0);
+		_anim0ActvFl = true;
+		_raoulStatus = 1;
+		_game._player._visible = false;
+
+		_vm->_gameConv->run(16);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]);
+	}
+
+	if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(314, 86);
+		_game._player.walk(Common::Point(266, 98), FACING_SOUTHWEST);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene201::step() {
+	if (_anim0ActvFl)
+		handleRaoulAnimation();
+
+	if (_anim1ActvFl)
+		handleSellerAnimation();
+
+	if ((_needHoldFl) && (_vm->_gameConv->_running != 16)) {
+		_game._player._stepEnabled = false;
+		_needHoldFl = false;
+	}
+}
+
+void Scene201::actions() {
+	if (_vm->_gameConv->_running == 16) {
+		handleConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY)) {
+		_scene->_nextSceneId = 202;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_TICKET_SELLER)) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0);
+		_anim0ActvFl = true;
+		_raoulStatus = 1;
+		_vm->_gameConv->run(16);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]);
+		_game._player._visible = false;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		if (_globals[kCurrentYear] == 1993)
+			_vm->_dialogs->show(20110);
+		else
+			_vm->_dialogs->show(20111);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(20112);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(20113);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BUST)) {
+			_vm->_dialogs->show(20114);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PEDESTAL)) {
+			_vm->_dialogs->show(20115);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BARRIER)) {
+			_vm->_dialogs->show(20116);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PLACARD)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(20117);
+			else
+				_vm->_dialogs->show(20118);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TICKET_WINDOW)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(20119);
+			else
+				_vm->_dialogs->show(20120);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(20121);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TICKET_SELLER)) {
+			_vm->_dialogs->show(20123);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_TICKET_SELLER)) {
+		_vm->_dialogs->show(20124);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_BUST)) {
+		_vm->_dialogs->show(20122);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene201::preActions() {
+	if ((_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) && _action.isObject(NOUN_PLACARD))
+		_game._player.walk(Common::Point(147, 104), FACING_NORTHWEST);
+}
+
+void Scene201::handleRaoulAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _raoulFrame)
+		return;
+
+	_raoulFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int random = -1;
+	int resetFrame = -1;
+
+	switch (_raoulFrame) {
+	case 1:
+	case 19:
+	case 49:
+		random = _vm->getRandomNumber(4, 50);
+
+		switch (_raoulStatus) {
+		case 0:
+			random = 1;
+			break;
+
+		case 2:
+			random = 2;
+			_game._player._stepEnabled = false;
+			break;
+
+		case 3:
+			random = 3;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 9;
+			_raoulStatus = 1;
+			break;
+
+		case 2:
+			resetFrame = 1;
+			break;
+
+		case 3:
+			_game._player._visible = true;
+			_sellerStatus = 2;
+			_anim0ActvFl = false;
+			resetFrame = 49;
+			_game._player._stepEnabled = true;
+			_needHoldFl = false;
+			break;
+
+		case 4:
+			resetFrame = 19;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+
+		}
+		break;
+
+	case 5:
+		_scene->deleteSequence(_globals._sequenceIndexes[1]);
+		_game._objects.addToInventory(OBJ_ENVELOPE);
+		_vm->_sound->command(26);
+		_vm->_dialogs->showItem(OBJ_ENVELOPE, 834, 0);
+		break;
+
+	case 9:
+		_game._player._visible = true;
+		_anim0ActvFl = false;
+		_game._player._stepEnabled = true;
+		resetFrame = 49;
+		break;
+
+	case 23:
+	case 35:
+	case 45:
+		random = _vm->getRandomNumber(3, 70);
+
+		switch (_raoulStatus) {
+		case 0:
+			random = 2;
+			break;
+
+		case 2:
+		case 3:
+			random = 1;
+			break;
+
+		default:
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 45;
+			break;
+
+		case 2:
+			resetFrame = 23;
+			_raoulStatus = 1;
+			break;
+
+		case 3:
+			resetFrame = 35;
+			break;
+
+		default:
+			resetFrame = 22;
+			break;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_raoulFrame = resetFrame;
+	}
+}
+
+void Scene201::handleSellerAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _sellerFrame )
+		return;
+
+	int random = -1;
+	int resetFrame = -1;
+	_sellerFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+
+	switch (_sellerFrame ) {
+	case 1:
+	case 2:
+	case 3:
+	case 4:
+	case 5:
+	case 6:
+	case 7:
+	case 10:
+		if (_sellerFrame == 10)
+			_raoulStatus = 2;
+
+		switch (_sellerStatus) {
+		case 0:
+			random = 1;
+			break;
+
+		case 1:
+			random = _vm->getRandomNumber(1, 5);
+			++_sellerCount;
+			if (_sellerCount > 30) {
+				_sellerStatus = 0;
+				random = 6;
+			}
+			break;
+
+		case 2:
+			if (_sellerFrame == 6)
+				random = 6;
+			else if (_sellerFrame == 7)
+				random = 7;
+			else
+				random = _vm->getRandomNumber(6, 7);
+
+			++_sellerCount;
+			if (_sellerCount > 30) {
+				_sellerCount = 0;
+				random = _vm->getRandomNumber(6, 7);
+			}
+			break;
+
+		case 3:
+			random = 8;
+			break;
+
+		default:
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 0;
+			break;
+
+		case 2:
+			resetFrame = 1;
+			break;
+
+		case 3:
+			resetFrame = 2;
+			break;
+
+		case 4:
+			resetFrame = 3;
+			break;
+
+		case 5:
+			resetFrame = 4;
+			break;
+
+		case 6:
+			resetFrame = 5;
+			break;
+
+		case 7:
+			resetFrame = 6;
+			break;
+
+		case 8:
+			resetFrame = 7;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 9:
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+		_sellerStatus = 2;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_sellerFrame = resetFrame;
+	}
+}
+
+void Scene201::handleConversation() {
+	int interlocutorFl = false;
+	int heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 4:
+	case 12:
+	case 13:
+	case 14:
+		_vm->_gameConv->setInterlocutorTrigger(90);
+		_needHoldFl = true;
+		interlocutorFl = true;
+		break;
+
+	case 6:
+		_sellerStatus = 3;
+		_needHoldFl = true;
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 65:
+		if (_sellerStatus != 3)
+			_sellerStatus = 1;
+		break;
+
+	case 70:
+		if (_sellerStatus != 3) {
+			_sellerStatus = 0;
+			_raoulStatus = 0;
+		}
+		break;
+
+	case 90:
+		_vm->_gameConv->setHeroTrigger(91);
+		heroFl = true;
+		break;
+
+	case 91:
+		_raoulStatus = 3;
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(70);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(65);
+
+	_sellerCount = 0;
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index 9ecd7b4..e30224e 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -53,6 +53,31 @@ public:
 	Scene2xx(MADSEngine *vm) : PhantomScene(vm) {}
 };
 
+class Scene201 : public Scene2xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _needHoldFl;
+	int _sellerCount;
+	int _sellerStatus;
+	int _sellerFrame;
+	int _raoulFrame;
+	int _raoulStatus;
+
+	void handleSellerAnimation();
+	void handleRaoulAnimation();
+	void handleConversation();
+
+public:
+	Scene201(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 9bb46f2af335077bced3efca4fd67c20e8b9d009
    https://github.com/scummvm/scummvm/commit/9bb46f2af335077bced3efca4fd67c20e8b9d009
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-22T17:16:16+02:00

Commit Message:
MADS: Phantom: Some renaming in scene 113

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 0b6f4af..439c6c5 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -7651,19 +7651,19 @@ void Scene112::handleRaoulChair() {
 /*------------------------------------------------------------------------*/
 
 Scene113::Scene113(MADSEngine *vm) : Scene1xx(vm) {
-	_standing_talking = false;
-	_day_wants_to_talk = false;
-	_music_is_playing = false;
-	_right_after_kiss = false;
-	_anim_0_running = false;
-	_anim_1_running = false;
-	_anim_2_running = false;
-	_anim_3_running = false;
-	_anim_4_running = false;
-	_prevent_1 = false;
-	_prevent_2 = false;
-	_raoul_is_up = false;
-	_arms_are_out = false;
+	_standingAndTalking = false;
+	_dayWantsToTalk = false;
+	_musicPlaying = false;
+	_afterKissFl = false;
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+	_anim4ActvFl = false;
+	_prevent1 = false;
+	_prevent2 = false;
+	_raoulStandingFl = false;
+	_armsOutFl = false;
 
 	_dayStatus = -1;
 	_raoulAction = -1;
@@ -7685,19 +7685,19 @@ Scene113::Scene113(MADSEngine *vm) : Scene1xx(vm) {
 void Scene113::synchronize(Common::Serializer &s) {
 	Scene1xx::synchronize(s);
 
-	s.syncAsByte(_standing_talking);
-	s.syncAsByte(_day_wants_to_talk);
-	s.syncAsByte(_music_is_playing);
-	s.syncAsByte(_right_after_kiss);
-	s.syncAsByte(_anim_0_running);
-	s.syncAsByte(_anim_1_running);
-	s.syncAsByte(_anim_2_running);
-	s.syncAsByte(_anim_3_running);
-	s.syncAsByte(_anim_4_running);
-	s.syncAsByte(_prevent_1);
-	s.syncAsByte(_prevent_2);
-	s.syncAsByte(_raoul_is_up);
-	s.syncAsByte(_arms_are_out);
+	s.syncAsByte(_standingAndTalking);
+	s.syncAsByte(_dayWantsToTalk);
+	s.syncAsByte(_musicPlaying);
+	s.syncAsByte(_afterKissFl);
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_anim3ActvFl);
+	s.syncAsByte(_anim4ActvFl);
+	s.syncAsByte(_prevent1);
+	s.syncAsByte(_prevent2);
+	s.syncAsByte(_raoulStandingFl);
+	s.syncAsByte(_armsOutFl);
 
 	s.syncAsSint16LE(_dayStatus);
 	s.syncAsSint16LE(_raoulAction);
@@ -7727,19 +7727,19 @@ void Scene113::setup() {
 
 void Scene113::enter() {
 	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
-		_standing_talking = false;
-		_day_wants_to_talk = false;
-		_music_is_playing = false;
-		_right_after_kiss = false;
-		_anim_0_running = false;
-		_anim_1_running = false;
-		_anim_2_running = false;
-		_anim_3_running = false;
-		_anim_4_running = false;
-		_prevent_1 = false;
-		_prevent_2 = false;
-		_raoul_is_up = false;
-		_arms_are_out = false;
+		_standingAndTalking = false;
+		_dayWantsToTalk = false;
+		_musicPlaying = false;
+		_afterKissFl = false;
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+		_anim3ActvFl = false;
+		_anim4ActvFl = false;
+		_prevent1 = false;
+		_prevent2 = false;
+		_raoulStandingFl = false;
+		_armsOutFl = false;
 	}
 
 	_scene->_hotspots.activate(NOUN_SMALL_NOTE, false);
@@ -7783,7 +7783,7 @@ void Scene113::enter() {
 		if (_globals[kCurrentYear] == 1881) {
 			if (_dayStatus <= 3) {
 				_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1);
-				_anim_1_running = true;
+				_anim1ActvFl = true;
 			}
 
 			if (_raoulAction == 3)
@@ -7794,9 +7794,9 @@ void Scene113::enter() {
 				_scene->setAnimFrame(_globals._animationIndexes[1], 8);
 			}
 
-			if (_music_is_playing) {
+			if (_musicPlaying) {
 				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0);
-				_anim_0_running = true;
+				_anim0ActvFl = true;
 				_christineHotspotId1 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
 				_scene->_dynamicHotspots[_christineHotspotId1]._articleNumber = PREP_ON;
 				_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 13);
@@ -7804,7 +7804,7 @@ void Scene113::enter() {
 				_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 16);
 				_scene->setAnimFrame(_globals._animationIndexes[0], 212);
 				_game._player._visible = true;
-				_anim_1_running = false;
+				_anim1ActvFl = false;
 			} else {
 				switch (_dayStatus) {
 				case 0:
@@ -7812,7 +7812,7 @@ void Scene113::enter() {
 				case 2:
 				case 3:
 					_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 0);
-					_anim_0_running = true;
+					_anim0ActvFl = true;
 					_dayStatus = 2;
 					_scene->setAnimFrame(_globals._animationIndexes[0], 208);
 					_scene->_hotspots.activate(NOUN_CHRISTINE, true);
@@ -7821,7 +7821,7 @@ void Scene113::enter() {
 
 				default:
 					_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0);
-					_anim_0_running = true;
+					_anim0ActvFl = true;
 					_dayStatus = 7;
 					_game._player._visible = false;
 					_scene->setAnimFrame(_globals._animationIndexes[0], 165);
@@ -7845,7 +7845,7 @@ void Scene113::enter() {
 		} else if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3)) {
 			_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('x', 1), 1);
 			_julieStatus = 0;
-			_anim_4_running = true;
+			_anim4ActvFl = true;
 			_globals[kMakeBrieLeave203] = true;
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
 			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
@@ -7858,13 +7858,13 @@ void Scene113::enter() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('f', 1), 1);
-			_anim_2_running = true;
+			_anim2ActvFl = true;
 
 			if (_florentStatus != 3)
 				_florentStatus = 1;
 
 			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('r', 1), 1);
-			_anim_3_running = true;
+			_anim3ActvFl = true;
 
 			if (_raoulAction == 3)
 				_scene->setAnimFrame(_globals._animationIndexes[3], 33);
@@ -7906,7 +7906,7 @@ void Scene113::enter() {
 
 			_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('x', 1), 1);
 			_julieStatus = 0;
-			_anim_4_running = true;
+			_anim4ActvFl = true;
 			_globals[kMakeBrieLeave203] = true;
 			_game._player._playerPos = Common::Point(190, 148);
 			_game._player._facing = FACING_NORTH;
@@ -7926,11 +7926,11 @@ void Scene113::enter() {
 
 			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('f', 1), 1);
 			_florentStatus = 1;
-			_anim_2_running = true;
+			_anim2ActvFl = true;
 
 			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('r', 1), 1);
 			_raoulAction = 3;
-			_anim_3_running = true;
+			_anim3ActvFl = true;
 			_scene->setAnimFrame(_globals._animationIndexes[3], 33);
 
 			if (_globals[kFlorentNameIsKnown] >= 1) {
@@ -7956,11 +7956,11 @@ void Scene113::enter() {
 	} else if ((_globals[kCurrentYear] == 1881) && (! _globals[kChrisKickedRaoulOut])) {
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1);
 		_raoulAction = 3;
-		_anim_1_running = true;
+		_anim1ActvFl = true;
 		_scene->setAnimFrame(_globals._animationIndexes[1], 33);
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1);
 		_dayStatus = 2;
-		_anim_0_running = true;
+		_anim0ActvFl = true;
 
 		_scene->_hotspots.activate(NOUN_CHRISTINE, true);
 		_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(220, 130));
@@ -8003,16 +8003,16 @@ void Scene113::enter() {
 }
 
 void Scene113::step() {
-	if (_anim_1_running)
+	if (_anim1ActvFl)
 		handleRaoulAnimation2();
 
-	if (_anim_4_running)
+	if (_anim4ActvFl)
 		handleJulieAnimation();
 
-	if (_anim_2_running)
+	if (_anim2ActvFl)
 		handleFlorentAnimation();
 
-	if (_anim_3_running) {
+	if (_anim3ActvFl) {
 		handleRaoulAnimation();
 
 		if ((!_game._objects.isInInventory(OBJ_SMALL_NOTE)) && (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 26)) {
@@ -8024,28 +8024,28 @@ void Scene113::step() {
 		}
 	}
 
-	if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 86) && (!_prevent_2)) {
+	if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 86) && (!_prevent2)) {
 		_scene->freeAnimation(_globals._animationIndexes[0]);
-		_prevent_2 = true;
+		_prevent2 = true;
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0);
 		_scene->setAnimFrame (_globals._animationIndexes[0], 86);
 		_game.syncTimers(3, _globals._animationIndexes[0], 4, 0);
 		_scene->animations_tick();
 	}
 
-	if (_anim_0_running) {
+	if (_anim0ActvFl) {
 		handleDayAnimation();
 
-		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 95) && (!_arms_are_out)) {
-			_standing_talking = true;
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 95) && (!_armsOutFl)) {
+			_standingAndTalking = true;
 			_dayStatus = 7;
 			_raoulAction = 3;
-			_arms_are_out = true;
+			_armsOutFl = true;
 			_game.syncTimers(3, _globals._animationIndexes[0], 3, _globals._animationIndexes[1]);
 		}
 
-		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 165) && !_right_after_kiss)
-			_right_after_kiss = true;
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 165) && !_afterKissFl)
+			_afterKissFl = true;
 	}
 
 	switch (_game._trigger) {
@@ -8293,7 +8293,7 @@ void Scene113::actions() {
 			if (_globals[kCurrentYear] == 1993)
 				_vm->_dialogs->show(11341);
 			else {
-				if (_music_is_playing)
+				if (_musicPlaying)
 					_vm->_dialogs->show(11336);
 				else
 					_vm->_dialogs->show(11342);
@@ -8336,7 +8336,7 @@ void Scene113::preActions() {
 		_game._player.walk(Common::Point(272, 138), FACING_EAST);
 
 	if (! _action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR) && !_globals[kChrisKickedRaoulOut]
-	 && !_action.isAction(VERB_LOOK, NOUN_CHRISTINE) && !_action.isAction(VERB_TAKE, NOUN_CHRISTINE) && _music_is_playing) {
+	 && !_action.isAction(VERB_LOOK, NOUN_CHRISTINE) && !_action.isAction(VERB_TAKE, NOUN_CHRISTINE) && _musicPlaying) {
 		_vm->_gameConv->run(13);
 		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
 		_game._player.cancelCommand();
@@ -8518,14 +8518,14 @@ void Scene113::handleDayAnimation() {
 			} else {
 				_dayStatus = 1;
 				resetFrame = 25;
-				_day_wants_to_talk = false;
+				_dayWantsToTalk = false;
 			}
 			break;
 
 		case 1:
-			if (_day_wants_to_talk) {
+			if (_dayWantsToTalk) {
 				_dayStatus = 0;
-				_day_wants_to_talk = false;
+				_dayWantsToTalk = false;
 				resetFrame = 1;
 			} else {
 				resetFrame = 25;
@@ -8569,7 +8569,7 @@ void Scene113::handleDayAnimation() {
 				_dayStatus = 7;
 				resetFrame = 165;
 			}
-			if (_music_is_playing)
+			if (_musicPlaying)
 				resetFrame = 167;
 			break;
 
@@ -8586,13 +8586,13 @@ void Scene113::handleDayAnimation() {
 				resetFrame = 165;
 			}
 
-			if (_music_is_playing)
+			if (_musicPlaying)
 				resetFrame = 167;
 			break;
 
 		case 7:
 			resetFrame = 165;
-			if (_music_is_playing)
+			if (_musicPlaying)
 				resetFrame = 167;
 			break;
 
@@ -8670,7 +8670,7 @@ void Scene113::handleRaoulAnimation() {
 
 		case 4:
 			resetFrame = 38;
-			_raoul_is_up = true;
+			_raoulStandingFl = true;
 			_vm->_gameConv->hold();
 			break;
 
@@ -8690,7 +8690,7 @@ void Scene113::handleRaoulAnimation() {
 			_raoulAction = 1;
 		} else if (_raoulAction == 4) {
 			resetFrame = 38;
-			_raoul_is_up = true;
+			_raoulStandingFl = true;
 		} else if (_raoulAction == 0) {
 			resetFrame = 9;
 		} else {
@@ -8701,7 +8701,7 @@ void Scene113::handleRaoulAnimation() {
 
 	case 42:
 		if (_raoulAction == 4) {
-			if (!_prevent_2) {
+			if (!_prevent2) {
 				_vm->_gameConv->release();
 			}
 			resetFrame = 33;
@@ -8873,14 +8873,14 @@ void Scene113::handleFlorentConversation() {
 	switch (_action._activeAction._verbId) {
 	case 3:
 	case 4:
-		if (!_prevent_1) {
+		if (!_prevent1) {
 			_globals[kFlorentNameIsKnown] = 1;
 			_vm->_gameConv->setInterlocutorTrigger(82);
 			_scene->_dynamicHotspots.remove(_christineHotspotId2);
 			_christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29));
 			_scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON;
 			_scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST);
-			_prevent_1 = true;
+			_prevent1 = true;
 		}
 		break;
 
@@ -8895,11 +8895,11 @@ void Scene113::handleFlorentConversation() {
 		break;
 
 	case 26:
-		if (!_prevent_2) {
+		if (!_prevent2) {
 			_scene->_sequences.setTimingTrigger(120, 92);
 			_vm->_gameConv->setInterlocutorTrigger(96);
 			_florentStatus = 0;
-			_prevent_2 = true;
+			_prevent2 = true;
 		}
 		break;
 
@@ -8921,7 +8921,7 @@ void Scene113::handleFlorentConversation() {
 	case 62:
 		if ((_action._activeAction._verbId != 3) && (_action._activeAction._verbId != 4) && (_action._activeAction._verbId != 19) &&
 			(_action._activeAction._verbId != 27) && (_action._activeAction._verbId != 28) && (_action._activeAction._verbId != 29)) {
-				if ((_raoulAction != 5) && (_raoulAction != 4) && !_raoul_is_up)
+				if ((_raoulAction != 5) && (_raoulAction != 4) && !_raoulStandingFl)
 					_raoulAction = 0;
 
 				if ((_florentStatus != 3) && (_florentStatus != 2))
@@ -8937,7 +8937,7 @@ void Scene113::handleFlorentConversation() {
 					_florentStatus = 0;
 		}
 
-		if ((_raoulAction != 3) && (_raoulAction != 5) && (_raoulAction != 4) && (!_raoul_is_up)) {
+		if ((_raoulAction != 3) && (_raoulAction != 5) && (_raoulAction != 4) && (!_raoulStandingFl)) {
 			_raoulAction = 1;
 			random = _vm->getRandomNumber(1, 2);
 			if (random == 1)
@@ -9013,14 +9013,14 @@ void Scene113::handleLoveConversation() {
 	switch (_action._activeAction._verbId) {
 	case 1:
 	case 2:
-		if (!_prevent_1) {
+		if (!_prevent1) {
 			_vm->_gameConv->setInterlocutorTrigger(82);
-			_prevent_1 = true;
+			_prevent1 = true;
 		}
 		break;
 
 	case 21:
-		if (!_arms_are_out) {
+		if (!_armsOutFl) {
 			_dayStatus = 4;
 			_scene->_sequences.setTimingTrigger(1, 70);
 			_scene->_userInterface.emptyConversationList();
@@ -9036,10 +9036,10 @@ void Scene113::handleLoveConversation() {
 		break;
 
 	case 31:
-		if (!_music_is_playing) {
+		if (!_musicPlaying) {
 			_vm->_gameConv->hold();
 			_dayStatus = 7;
-			_music_is_playing = true;
+			_musicPlaying = true;
 			_christineHotspotId1 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots[_christineHotspotId1]._articleNumber = PREP_ON;
 			_scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 14);
@@ -9051,18 +9051,18 @@ void Scene113::handleLoveConversation() {
 	switch (_game._trigger) {
 	case 62:
 		if (_action._activeAction._verbId != 0) {
-			if (_standing_talking) {
+			if (_standingAndTalking) {
 				_dayStatus = 6;
 			} else if (_dayStatus != 4) {
 				_dayStatus = 1;
 				_raoulAction = 0;
-				_day_wants_to_talk = false;
+				_dayWantsToTalk = false;
 			}
 		}
 		break;
 
 	case 66:
-		if (_standing_talking) {
+		if (_standingAndTalking) {
 			_dayStatus = 5;
 
 		} else {
@@ -9070,7 +9070,7 @@ void Scene113::handleLoveConversation() {
 				_dayStatus = 3;
 			} else {
 				_dayStatus = 1;
-				_day_wants_to_talk = true;
+				_dayWantsToTalk = true;
 			}
 
 			if (_raoulAction != 3) {
@@ -9084,14 +9084,14 @@ void Scene113::handleLoveConversation() {
 		break;
 
 	case 70:
-		if (_arms_are_out) {
+		if (_armsOutFl) {
 			_vm->_gameConv->release();
 			_vm->_gameConv->setInterlocutorTrigger(76);
 		}
 		break;
 
 	case 72:
-		if (_right_after_kiss)
+		if (_afterKissFl)
 			_vm->_gameConv->release();
 		else
 			_scene->_sequences.setTimingTrigger(1, 72);
@@ -9103,7 +9103,7 @@ void Scene113::handleLoveConversation() {
 		break;
 
 	case 78:
-		if (_arms_are_out) {
+		if (_armsOutFl) {
 			_vm->_gameConv->release();
 			_vm->_gameConv->setInterlocutorTrigger(76);
 		}
@@ -9121,7 +9121,7 @@ void Scene113::handleLoveConversation() {
 		_scene->_sequences.setTimingTrigger(120, 84);
 		_vm->_gameConv->hold();
 		_dayStatus = 1;
-		_day_wants_to_talk = true;
+		_dayWantsToTalk = true;
 		break;
 
 	case 84:
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index e2b4faa..d1be6e0 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -340,19 +340,19 @@ public:
 
 class Scene113 : public Scene1xx {
 private:
-	bool _standing_talking;
-	bool _day_wants_to_talk;
-	bool _music_is_playing;
-	bool _right_after_kiss;
-	bool _anim_0_running;
-	bool _anim_1_running;
-	bool _anim_2_running;
-	bool _anim_3_running;
-	bool _anim_4_running;
-	bool _prevent_1;
-	bool _prevent_2;
-	bool _raoul_is_up;
-	bool _arms_are_out;
+	bool _standingAndTalking;
+	bool _dayWantsToTalk;
+	bool _musicPlaying;
+	bool _afterKissFl;
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _anim3ActvFl;
+	bool _anim4ActvFl;
+	bool _prevent1;
+	bool _prevent2;
+	bool _raoulStandingFl;
+	bool _armsOutFl;
 
 	int _christineHotspotId1;
 	int _christineHotspotId2;


Commit: 2856020c37fd6d216a7be74545d2ac6619124c35
    https://github.com/scummvm/scummvm/commit/2856020c37fd6d216a7be74545d2ac6619124c35
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-22T21:22:37+02:00

Commit Message:
MADS: Dragon: Add generic scene for group 1

Changed paths:
  A engines/mads/dragonsphere/dragonsphere_scenes1.cpp
  A engines/mads/dragonsphere/dragonsphere_scenes1.h
  A engines/mads/dragonsphere/globals_dragonsphere.cpp
  A engines/mads/dragonsphere/globals_dragonsphere.h
    engines/mads/dragonsphere/dragonsphere_scenes.h
    engines/mads/dragonsphere/game_dragonsphere.cpp
    engines/mads/dragonsphere/game_dragonsphere.h
    engines/mads/module.mk



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.h b/engines/mads/dragonsphere/dragonsphere_scenes.h
index 173cc66..2ecf8e9 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.h
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.h
@@ -29,7 +29,6 @@
 #include "mads/dragonsphere/game_dragonsphere.h"
 //#include "mads/dragonsphere/globals_dragonsphere.h"
 
-
 namespace MADS {
 
 namespace Dragonsphere {
@@ -656,27 +655,6 @@ protected:
 };
 
 // TODO: Temporary, remove once implemented properly
-class Scene1xx : public DragonsphereScene {
-protected:
-	/**
-	 * Plays an appropriate sound when entering a scene
-	 */
-	void sceneEntrySound() {}
-
-	/**
-	 *Sets the AA file to use for the scene
-	 */
-	void setAAName() {}
-
-	/**
-	 * Updates the prefix used for getting player sprites for the scene
-	 */
-	void setPlayerSpritesPrefix() {}
-public:
-	Scene1xx(MADSEngine *vm) : DragonsphereScene(vm) {}
-};
-
-// TODO: Temporary, remove once implemented properly
 class DummyScene : public DragonsphereScene {
 public:
 	DummyScene(MADSEngine *vm) : DragonsphereScene(vm) {
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
new file mode 100644
index 0000000..6635354
--- /dev/null
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -0,0 +1,209 @@
+/* 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/scummsys.h"
+#include "mads/mads.h"
+#include "mads/conversations.h"
+#include "mads/scene.h"
+#include "mads/dragonsphere/dragonsphere_scenes.h"
+#include "mads/dragonsphere/dragonsphere_scenes1.h"
+
+namespace MADS {
+
+namespace Dragonsphere {
+
+void Scene1xx::setAAName() {
+	int interface;
+
+	switch (_scene->_nextSceneId) {
+	case 108:
+	case 109:
+		interface = 3;
+		break;
+	case 110:
+		interface = 5;
+		break;
+	case 113:
+	case 114:
+	case 115:
+	case 117:
+	case 119:
+		interface = 1;
+		break;
+	case 116:
+		interface = 2;
+		break;
+	case 120:
+		interface = 8;
+		break;
+	default:
+		interface = 0;
+		break;
+	}
+
+	_game._aaName = Resources::formatAAName(interface);
+	_vm->_palette->setEntry(254, 56, 47, 32);
+
+}
+
+void Scene1xx::sceneEntrySound() {
+	if (!_vm->_musicFlag)
+		return;
+
+	switch (_scene->_nextSceneId) {
+	case 104:
+		if (_globals[kPlayerPersona] == 1)
+			_vm->_sound->command(44);
+		else
+			_vm->_sound->command(16);
+		break;
+
+	case 106:
+		if (_globals[kEndOfGame])
+			_vm->_sound->command(47);
+		else
+			_vm->_sound->command(16);
+		break;
+
+	case 108:
+		if (_game._visitedScenes.exists(109))
+			_vm->_sound->command(32);
+		else
+			_vm->_sound->command(33);
+		break;
+
+	case 109:
+		_vm->_sound->command(32);
+		break;
+
+	case 110:
+		_vm->_sound->command(37);
+		break;
+
+	case 111:
+		_vm->_sound->command(34);
+		break;
+
+	case 112:
+		_vm->_sound->command(38);
+		break;
+
+	case 113:
+		_vm->_sound->command(5);
+		if (_globals[kPlayerIsSeal])
+			_vm->_sound->command(35);
+		else
+			_vm->_sound->command(36);
+		break;
+
+	case 114:
+		_vm->_sound->command(36);
+		break;
+
+	case 115:
+		_vm->_sound->command(39);
+		break;
+
+	case 116:
+		_vm->_sound->command(40);
+		break;
+
+	case 117:
+		_vm->_sound->command(35);
+		break;
+
+	case 119:
+		_vm->_sound->command(41);
+		break;
+
+	case 120:
+		_vm->_sound->command(46);
+		break;
+
+	default:
+		_vm->_sound->command(16);
+		break;
+	}
+}
+
+void Scene1xx::setPlayerSpritesPrefix() {
+	int darkSceneFl = false;
+	int noPlayerFl = false;
+
+	_vm->_sound->command(5);
+	Common::String oldName = _game._player._spritesPrefix;
+
+	_globals[kPerformDisplacements] = true;
+
+	switch (_scene->_nextSceneId) {
+	case 106:
+		if (_scene->_currentSceneId == 120)
+			noPlayerFl = true;
+		break;
+
+	case 108:
+	case 109:
+	case 114:
+	case 115:
+		darkSceneFl = true;
+		break;
+
+	case 111:
+	case 112:
+	case 117:
+	case 120:
+	case 119:
+		noPlayerFl = true;
+		break;
+
+	case 113:
+		if (!_globals[kPlayerPersona])
+			noPlayerFl = true;
+		darkSceneFl = true;
+		break;
+	}
+
+	if (noPlayerFl || _globals[kNoLoadWalker]) {
+		_game._player._spritesPrefix = "";
+	} else if (!_game._player._forcePrefix) {
+		if (!_globals[kPlayerPersona] || _scene->_nextSceneId == 108 || _scene->_nextSceneId == 109) {
+			if (_scene->_nextSceneId == 113 || _scene->_nextSceneId == 114 || _scene->_nextSceneId == 115 || _scene->_nextSceneId == 116)
+				_game._player._spritesPrefix = "PD";
+			else
+				_game._player._spritesPrefix = "KG";
+		} else
+			_game._player._spritesPrefix = "PD";
+
+		if (darkSceneFl)
+			_game._player._spritesPrefix += "D";
+	}
+
+	if (oldName != _game._player._spritesPrefix)
+		_game._player._spritesChanged = true;
+
+	_game._player._scalingVelocity = true;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Dragonsphere
+} // End of namespace MADS
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h
new file mode 100644
index 0000000..4194845
--- /dev/null
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.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 MADS_DRAGON_SCENES1_H
+#define MADS_DRAGON_SCENES1_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/dragonsphere/dragonsphere_scenes.h"
+
+namespace MADS {
+
+namespace Dragonsphere {
+
+class Scene1xx : public DragonsphereScene {
+protected:
+	/**
+	 * Plays an appropriate sound when entering a scene
+	 */
+	void sceneEntrySound();
+
+	/**
+	 *Sets the AA file to use for the scene
+	 */
+	void setAAName();
+
+	/**
+	 * Updates the prefix used for getting player sprites for the scene
+	 */
+	void setPlayerSpritesPrefix();
+public:
+	Scene1xx(MADSEngine *vm) : DragonsphereScene(vm) {}
+};
+
+} // End of namespace Dragonsphere
+} // End of namespace MADS
+
+#endif /* MADS_DRAGON_SCENES1_H */
diff --git a/engines/mads/dragonsphere/game_dragonsphere.cpp b/engines/mads/dragonsphere/game_dragonsphere.cpp
index b07eab9..f528056 100644
--- a/engines/mads/dragonsphere/game_dragonsphere.cpp
+++ b/engines/mads/dragonsphere/game_dragonsphere.cpp
@@ -28,7 +28,7 @@
 #include "mads/msurface.h"
 #include "mads/dragonsphere/game_dragonsphere.h"
 //#include "mads/nebular/dialogs_nebular.h"
-//#include "mads/nebular/globals_nebular.h"
+#include "mads/dragonsphere/globals_dragonsphere.h"
 #include "mads/dragonsphere/dragonsphere_scenes.h"
 
 namespace MADS {
diff --git a/engines/mads/dragonsphere/game_dragonsphere.h b/engines/mads/dragonsphere/game_dragonsphere.h
index b57f883..290c38d 100644
--- a/engines/mads/dragonsphere/game_dragonsphere.h
+++ b/engines/mads/dragonsphere/game_dragonsphere.h
@@ -26,7 +26,7 @@
 #include "common/scummsys.h"
 #include "mads/game.h"
 #include "mads/globals.h"
-//#include "mads/nebular/globals_nebular.h"
+#include "mads/dragonsphere/globals_dragonsphere.h"
 
 namespace MADS {
 
@@ -88,15 +88,6 @@ enum InventoryObject {
 	OBJ_NEW_BUNDLE = 48
 };
 
-// HACK: A stub for now, remove from here once it's implemented properly
-class DragonsphereGlobals : public Globals {
-public:
-	DragonsphereGlobals() {
-		resize(210);	// Rex has 210 globals
-	}
-	virtual ~DragonsphereGlobals() {}
-};
-
 class GameDragonsphere : public Game {
 	friend class Game;
 protected:
diff --git a/engines/mads/dragonsphere/globals_dragonsphere.cpp b/engines/mads/dragonsphere/globals_dragonsphere.cpp
new file mode 100644
index 0000000..fa05ed9
--- /dev/null
+++ b/engines/mads/dragonsphere/globals_dragonsphere.cpp
@@ -0,0 +1,51 @@
+/* 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/scummsys.h"
+#include "common/config-manager.h"
+#include "mads/dragonsphere/globals_dragonsphere.h"
+
+namespace MADS {
+
+namespace Dragonsphere {
+
+DragonsphereGlobals::DragonsphereGlobals()
+	: Globals() {
+	// Initialize lists
+	resize(140);
+	_spriteIndexes.resize(30);
+	_sequenceIndexes.resize(30);
+	_animationIndexes.resize(30);
+}
+
+void DragonsphereGlobals::synchronize(Common::Serializer &s) {
+	Globals::synchronize(s);
+
+	_spriteIndexes.synchronize(s);
+	_sequenceIndexes.synchronize(s);
+	_animationIndexes.synchronize(s);
+}
+
+
+} // End of namespace Dragonsphere
+
+} // End of namespace MADS
diff --git a/engines/mads/dragonsphere/globals_dragonsphere.h b/engines/mads/dragonsphere/globals_dragonsphere.h
new file mode 100644
index 0000000..cc0e42e
--- /dev/null
+++ b/engines/mads/dragonsphere/globals_dragonsphere.h
@@ -0,0 +1,184 @@
+/* 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 MADS_GLOBALS_DRAGONSPHERE_H
+#define MADS_GLOBALS_DRAGONSPHERE_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "mads/game.h"
+#include "mads/resources.h"
+
+namespace MADS {
+
+namespace Dragonsphere {
+
+enum GlobalId {
+	// Global variables
+
+	kWalkerTiming           = 0,
+	kWalkerTiming2			= 1,
+	kPlayerPersona = 10,
+	kPlayerScore = 11,
+	kDragonHighScene = 12,
+	kDragonMyScene = 13,
+	kNoLoadWalker = 14,
+	kPlayerScoreFlags = 15,
+	kSorcerorDefeated = 16,
+	kPreRoom = 17,
+	kPerformDisplacements = 18,
+
+	kKingStatus = 20,
+	kWardStatus = 21,
+	kTalkedToSoptus = 22,
+	kTalkedToShifter = 23,
+	kAmuletStatus = 24,
+	kBooksStatus = 25,
+	kTapestryStatus = 26,
+	kTalkedToMerchant = 27,
+	kCanViewCrownHole = 28,
+	kTalkedToStatus = 29,
+
+	kGuardPidStatus = 30,
+	kCrawledOutOfBed101 = 31,
+	kStatueIsOnStairway114 = 32,
+	kDogIsAsleep = 33,
+	kCrystalBallDead = 34,
+	kThrewBone = 35,
+	kWoodenDoorOpen = 36,
+	kKingIsInStairwell = 37,
+	kLlanieStatus = 38,
+	kNoTalkToGuard = 39,
+
+	kObjectGiven201 = 40,
+	kKingGotStabbed = 41,
+	kGivenObjectBefore = 42,
+	kGuardsAreAsleep = 43,
+	kDomeUp = 44,
+	kTalkedToWise = 45,
+	kDollGiven = 46,
+	kResetConv = 47,
+	kTalkedToGreta = 48,
+	kSlimeHealed = 49,
+
+	kDanceMusicOn = 50,
+	kPlayerIsSeal = 51,
+	kVinesHavePlayer = 52,
+	kEndOfGame = 53,
+	kResetConv2 = 54,
+	kInvokedFrom111 = 55,
+
+	kSaveWinsInDesert = 60,
+	kBubblesUpIn301 = 61,
+	kBubbleWontAttack = 62,
+	kPidLookedAtDoll = 63,
+
+	kOasis = 80,
+	kFireHoles = 81,
+	kDesertRoom = 82,
+	kFromDirection = 83,
+	kDesertCounter = 84,
+	kMoveDirection409 = 85,
+	kHealVerbsVisible = 86,
+	kGrapesHaveGrown = 87,
+	kPidTalkShamon = 88,
+	kPidJustDied = 89,
+
+	kGrapesAreDead = 90,
+	kRocIsChewingDates = 91,
+	kWinsInDesert = 92,
+	kWinsTillPrize = 93,
+	kPidHasBeenHealedSop = 94,
+	kGamePoints = 95,
+	kDancePoints = 96,
+	kCluePoints = 97,
+	kPrizesOwedToPlayer = 98,
+	kObjectFlags = 99,
+
+	kWaterfallDiverted = 100,
+	kShakStatus = 101,
+	kMaxGridValue = 102,
+	kMoveDirection510 = 103,
+	kShak506Angry = 104,
+	kMonsterIsDead = 105,
+	kDoneTalkingLani502 = 106,
+	kFoundLani504 = 107,
+	kSaidUseSwordShak = 108,
+	kGobletFilledSoporific = 109,
+
+	kBeenIn504AsPid = 110,
+	kSeenLaniDeadFirstTime = 111,
+	kSaidPoemIn504 = 112,
+	kTriedToHealLlanie504 = 113,
+	kPutBundleOnLlanie504 = 114,
+	kMake504Empty = 115,
+	kHasTakenMud = 116,
+	kPlatformClicked606 = 117,
+	kHadSpiritBundle = 118,
+
+	kMudIsInEye603 = 120,
+	kRopeIsAlive = 121,
+	kRatCageIsOpen = 122,
+	kFlaskOnPlate = 123,
+	kFluidIsDripping = 124,
+	kHoleIsIn607 = 125,
+	kRopeIsHangingIn607 = 126,
+	kObjectIsInFreezer605 = 127,
+	kObjectImitated = 128,
+	kHasRed = 129,
+
+	kHasYellow = 130,
+	kHasBlue = 131,
+	kWizardDead = 132,
+	kVineWillGrab = 133,
+	kFloorIsCool = 134,
+	kRatMelted = 135,
+	kDoorIsCool = 136,
+	kUsedElevator = 137,
+	kBeenOnTopFloor = 138,
+	kTorchIsIn609 = 139,
+
+	kGridPosition = 140
+	};
+
+class DragonsphereGlobals : public Globals {
+public:
+	SynchronizedList _spriteIndexes;
+	SynchronizedList _sequenceIndexes;
+	SynchronizedList _animationIndexes;
+public:
+	/**
+	 * Constructor
+	 */
+	DragonsphereGlobals();
+
+	/**
+	* Synchronize the globals data
+	*/
+	virtual void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace Dragonsphere
+
+} // End of namespace MADS
+
+#endif /* MADS_GLOBALS_DRAGONSPHERE_H */
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 3bd9ef5..998e09b 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -3,6 +3,8 @@ MODULE := engines/mads
 MODULE_OBJS := \
 	dragonsphere/game_dragonsphere.o \
 	dragonsphere/dragonsphere_scenes.o \
+	dragonsphere/dragonsphere_scenes1.o \
+	dragonsphere/globals_dragonsphere.o \
 	phantom/game_phantom.o \
 	phantom/globals_phantom.o \
 	phantom/phantom_scenes.o \


Commit: 43065c9ee26bd0f82da0fe00cb6309c77acc029e
    https://github.com/scummvm/scummvm/commit/43065c9ee26bd0f82da0fe00cb6309c77acc029e
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-22T22:15:57+02:00

Commit Message:
MADS: Dragon: Implement scene 101

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes.cpp
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/dragonsphere/dragonsphere_scenes1.h



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
index c24d0e9..0f0fb5c 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
@@ -28,6 +28,7 @@
 #include "mads/scene.h"
 #include "mads/dragonsphere/game_dragonsphere.h"
 #include "mads/dragonsphere/dragonsphere_scenes.h"
+#include "mads/dragonsphere/dragonsphere_scenes1.h"
 
 namespace MADS {
 
@@ -42,7 +43,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	switch (scene._nextSceneId) {
 	// Scene group #1 (Castle, river and caves)
 	case 101:	// king's bedroom
-		return new DummyScene(vm);	// TODO
+		return new Scene101(vm);
 	case 102:	// queen's bedroom
 		return new DummyScene(vm);	// TODO
 	case 103:	// outside king's bedroom
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 6635354..6f107df 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -205,5 +205,39 @@ void Scene1xx::setPlayerSpritesPrefix() {
 
 /*------------------------------------------------------------------------*/
 
+Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) {
+}
+
+void Scene101::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+}
+
+void Scene101::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene101::enter() {
+	sceneEntrySound();
+}
+
+void Scene101::step() {
+}
+
+void Scene101::actions() {
+	if (_action.isObject(NOUN_BED)) {
+		int sprIdx = _scene->_sprites.addSprites("*ob001i", false);
+		int seqIdx = _scene->_sequences.addStampCycle(sprIdx, false, 1);
+		_scene->_sequences.setDepth(seqIdx, 0);
+		_scene->_sequences.setPosition(seqIdx, Common::Point(10, 50));
+		_action._inProgress = false;
+	}
+}
+
+void Scene101::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Dragonsphere
 } // End of namespace MADS
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h
index 4194845..023a789 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.h
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.h
@@ -53,6 +53,17 @@ public:
 	Scene1xx(MADSEngine *vm) : DragonsphereScene(vm) {}
 };
 
+class Scene101 : public Scene1xx {
+public:
+	Scene101(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Dragonsphere
 } // End of namespace MADS
 


Commit: 91bc69b1a30e4146bd0c135358249dd7bb436e99
    https://github.com/scummvm/scummvm/commit/91bc69b1a30e4146bd0c135358249dd7bb436e99
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-22T23:23:06+03:00

Commit Message:
MADS: Phantom: Some initial work on reading conversation files

Changed paths:
    engines/mads/conversations.cpp



diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp
index ada740d..6b1b44d 100644
--- a/engines/mads/conversations.cpp
+++ b/engines/mads/conversations.cpp
@@ -22,9 +22,25 @@
 
 #include "mads/conversations.h"
 #include "mads/mads.h"
+#include "mads/compression.h"
+#include "common/file.h"
 
 namespace MADS {
 
+struct ConvData {
+	uint16 nodes;
+	uint16 unk1;
+	uint16 messages;
+	uint16 unk2;
+	uint16 unk3;
+	uint16 imports;
+	uint16 speakers;
+	Common::List<Common::String> portraits;
+	Common::String speechFile;
+};
+
+#define MAX_SPEAKERS 5
+
 GameConversation::GameConversation(MADSEngine *vm)
 	: _vm(vm) {
 	_running = _restoreRunning = 0;
@@ -34,6 +50,58 @@ GameConversation::~GameConversation() {
 }
 
 void GameConversation::get(int id) {
+	Common::File inFile;
+	Common::String fileName = Common::String::format("CONV%03d.CNV", id);
+	inFile.open(fileName);
+	MadsPack convFileUnpacked(&inFile);
+	Common::SeekableReadStream *convFile = convFileUnpacked.getItemStream(0);
+
+	char buffer[16];
+
+	ConvData conv;
+
+	// Section 0: Header
+	conv.nodes = convFile->readUint16LE();
+	conv.unk1 = convFile->readUint16LE();
+	conv.messages = convFile->readUint16LE();
+	conv.unk2 = convFile->readUint16LE();
+	conv.unk3 = convFile->readUint16LE();
+	conv.imports = convFile->readUint16LE();
+	conv.speakers = convFile->readUint16LE();
+
+	debug("Conv %d has %d nodes, %d messages, %d imports and %d speakers", id, conv.nodes, conv.messages, conv.imports, conv.speakers);
+
+	for (uint16 i = 0; i < MAX_SPEAKERS; i++) {
+		convFile->read(buffer, 16);
+		Common::String portrait = buffer;
+		debug("Speaker %d, portrait %s", i, portrait.c_str());
+		conv.portraits.push_back(portrait);
+	}
+
+	for (uint16 i = 0; i < MAX_SPEAKERS; i++) {
+		convFile->skip(2);
+	}
+
+	convFile->read(buffer, 14);
+	conv.speechFile = Common::String(buffer);
+	debug("Speech file %s", conv.speechFile.c_str());
+
+	convFile->skip(32);	// unknown bytes
+
+	// Section 1
+	convFile = convFileUnpacked.getItemStream(1);
+
+	for (uint16 i = 0; i < conv.nodes; i++) {
+		uint16 nodeIndex = convFile->readUint16LE();
+		debug("Node %d, index %d", i, nodeIndex);
+		convFile->skip(2);	// 01 00
+		convFile->skip(6);
+	}
+
+	// TODO: Read the rest of the sections
+
+	inFile.close();
+
 	warning("TODO GameConversation::get");
 }
 


Commit: 0f27b68d579319f26d358da094f7ab180b8df312
    https://github.com/scummvm/scummvm/commit/0f27b68d579319f26d358da094f7ab180b8df312
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-22T23:23:07+03:00

Commit Message:
MADS: Phantom: Disable auto camera adjust code for V2 games, for now

Changed paths:
    engines/mads/animation.cpp



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index 1c492bb..0b0e28a 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -464,21 +464,25 @@ void Animation::update() {
 		scene._spriteSlots.fullRefresh();
 	}
 
-	// Handle any offset adjustment for sprites as of this frame
-	bool paChanged = false;
-	if (scene._posAdjust.x != misc._posAdjust.x) {
-		scene._posAdjust.x = misc._posAdjust.x;
-		paChanged = true;
-	}
-	if (scene._posAdjust.y != misc._posAdjust.y) {
-		scene._posAdjust.y = misc._posAdjust.y;
-		paChanged = true;
-	}
+	bool isV2 = (_vm->getGameID() != GType_RexNebular);
+	if (!isV2) {
+		// Handle any offset adjustment for sprites as of this frame
+		// FIXME: This doesn't work properly for Phantom scene 101
+		bool paChanged = false;
+		if (scene._posAdjust.x != misc._posAdjust.x) {
+			scene._posAdjust.x = misc._posAdjust.x;
+			paChanged = true;
+		}
+		if (scene._posAdjust.y != misc._posAdjust.y) {
+			scene._posAdjust.y = misc._posAdjust.y;
+			paChanged = true;
+		}
 
-	if (paChanged) {
-		int newIndex = scene._spriteSlots.add();
-		scene._spriteSlots[newIndex]._seqIndex = -1;
-		scene._spriteSlots[newIndex]._flags = IMG_REFRESH;
+		if (paChanged) {
+			int newIndex = scene._spriteSlots.add();
+			scene._spriteSlots[newIndex]._seqIndex = -1;
+			scene._spriteSlots[newIndex]._flags = IMG_REFRESH;
+		}
 	}
 
 	// Main frame animation loop - frames get animated by being placed, as necessary, into the


Commit: 796b04d3cdc95986be03fab6eb66d50138942cfc
    https://github.com/scummvm/scummvm/commit/796b04d3cdc95986be03fab6eb66d50138942cfc
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-23T00:28:47+02:00

Commit Message:
MADS: Dragon: Implement scene 102

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes.cpp
    engines/mads/dragonsphere/dragonsphere_scenes.h
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/dragonsphere/dragonsphere_scenes1.h



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
index 0f0fb5c..c0781f5 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
@@ -45,7 +45,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 101:	// king's bedroom
 		return new Scene101(vm);
 	case 102:	// queen's bedroom
-		return new DummyScene(vm);	// TODO
+		return new Scene102(vm);
 	case 103:	// outside king's bedroom
 		return new DummyScene(vm);	// TODO
 	case 104:	// fireplace / bookshelf
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.h b/engines/mads/dragonsphere/dragonsphere_scenes.h
index 2ecf8e9..a3bc22c 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.h
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.h
@@ -33,24 +33,34 @@ namespace MADS {
 
 namespace Dragonsphere {
 
+enum Verb {
+	VERB_LOOK = 0x3,
+	VERB_TAKE = 0x4,
+	VERB_PUSH = 0x5,
+	VERB_OPEN = 0x6,
+	VERB_PUT = 0x7,
+	VERB_TALK_TO = 0x8,
+	VERB_GIVE = 0x9,
+	VERB_PULL = 0xA,
+	VERB_CLOSE = 0xB,
+	VERB_THROW = 0xC,
+	VERB_WALK_TO = 0xD,
+	VERB_WALK_ACROSS = 0x11,
+	VERB_WALK_BEHIND = 0x1C,
+	VERB_LOOK_AT = 0x1E,
+	VERB_WALK_THROUGH = 0x25,
+	VERB_WALK_INTO = 0x27,
+	VERB_WALK_DOWN = 0xA9,
+	VERB_WALK = 0x1CB,
+	VERB_WALK_AROUND = 0x221
+};
+
 enum Noun {
 	NOUN_GAME = 0x1,
 	NOUN_QSAVE = 0x2,
-	NOUN_LOOK = 0x3,
-	NOUN_TAKE = 0x4,
-	NOUN_PUSH = 0x5,
-	NOUN_OPEN = 0x6,
-	NOUN_PUT = 0x7,
-	NOUN_TALK_TO = 0x8,
-	NOUN_GIVE = 0x9,
-	NOUN_PULL = 0xA,
-	NOUN_CLOSE = 0xB,
-	NOUN_THROW = 0xC,
-	NOUN_WALK_TO = 0xD,
 	NOUN_NOTHING = 0xE,
 	NOUN_ = 0xF,
 	NOUN_FLOOR = 0x10,
-	NOUN_WALK_ACROSS = 0x11,
 	NOUN_RUG = 0x12,
 	NOUN_CARPET = 0x13,
 	NOUN_WALL = 0x14,
@@ -61,18 +71,14 @@ enum Noun {
 	NOUN_NIGHTSTAND = 0x19,
 	NOUN_TAPESTRY = 0x1A,
 	NOUN_DRESSING_SCREEN = 0x1B,
-	NOUN_WALK_BEHIND = 0x1C,
 	NOUN_ROYAL_CREST = 0x1D,
-	NOUN_LOOK_AT = 0x1E,
 	NOUN_WASHBASIN = 0x1F,
 	NOUN_WASH_AT = 0x20,
 	NOUN_BOOK = 0x21,
 	NOUN_FIREPLACE = 0x22,
 	NOUN_FIREPLACE_SCREEN = 0x23,
 	NOUN_DOOR_TO_QUEENS_ROOM = 0x24,
-	NOUN_WALK_THROUGH = 0x25,
 	NOUN_HALL_TO_SOUTH = 0x26,
-	NOUN_WALK_INTO = 0x27,
 	NOUN_WALL_PLAQUE = 0x28,
 	NOUN_DECORATION = 0x29,
 	NOUN_SWORDS = 0x2A,
@@ -202,7 +208,6 @@ enum Noun {
 	NOUN_DOOR = 0xA6,
 	NOUN_WALL_SWITCH = 0xA7,
 	NOUN_STAIRS = 0xA8,
-	NOUN_WALK_DOWN = 0xA9,
 	NOUN_EDGE_OF_ABYSS = 0xAA,
 	NOUN_COURTYARD = 0xAB,
 	NOUN_ROCK = 0xAC,
@@ -492,7 +497,6 @@ enum Noun {
 	NOUN_PATH_TO_HIGHTOWER = 0x1C8,
 	NOUN_SPIRIT_PLANE = 0x1C9,
 	NOUN_SPIRIT_TREE = 0x1CA,
-	NOUN_WALK = 0x1CB,
 	NOUN_REMAINS = 0x1CC,
 	NOUN_DOORWAY_TO_ELEVATOR = 0x1CD,
 	NOUN_DRAGON_DOOR = 0x1CE,
@@ -578,7 +582,6 @@ enum Noun {
 	NOUN_SHIFTER_VILLAGE = 0x21E,
 	NOUN_SLATHAN_SKY = 0x21F,
 	NOUN_SHIFTER = 0x220,
-	NOUN_WALK_AROUND = 0x221,
 	NOUN_WRECKED_BRIDGE = 0x222,
 	NOUN_SHACK = 0x223,
 	NOUN_WRECKED_SHACK = 0x224,
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 6f107df..5b5aa72 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -239,5 +239,429 @@ void Scene101::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) {
+	_diaryHotspotIdx1 = -1;
+	_diaryHotspotIdx2 = -1;
+	_diaryFrame = -1;
+	_animRunning = -1;
+}
+
+void Scene102::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsSint16LE(_diaryHotspotIdx1);
+	s.syncAsSint16LE(_diaryHotspotIdx2);
+	s.syncAsSint16LE(_diaryFrame);
+	s.syncAsSint16LE(_animRunning);
+}
+
+void Scene102::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_DIARIES);
+	_scene->addActiveVocab(VERB_WALK_TO);
+}
+
+void Scene102::enter() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 1), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 0), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 1), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', -1), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6", false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2), false);
+
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 0, 0);
+	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 0, 0);
+	_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0, 0, 0);
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12);
+	_diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST);
+
+	_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12);
+	_diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+	_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST);
+
+	if (_scene->_priorSceneId == 103) {
+		_game._player._playerPos = Common::Point(170, 152);
+		_game._player._facing = FACING_NORTHWEST;
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+	} else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+		_game._player.firstWalk(Common::Point(-10, 130), FACING_EAST, Common::Point(35, 144), FACING_EAST, false);
+		_game._player.setWalkTrigger(70);
+	} else {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene102::step() {
+	int resetFrame;
+
+	if ((_animRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) {
+			_diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+			resetFrame = -1;
+
+			switch (_diaryFrame) {
+			case 6:
+				_scene->deleteSequence(_globals._sequenceIndexes[1]);
+				_game.syncTimers(1, _globals._sequenceIndexes[1], 3, _globals._animationIndexes[0]);
+				break;
+
+			case 10:
+				_vm->_sound->command(65);
+				break;
+
+			case 26:
+				_vm->_dialogs->show(10210);
+				_vm->_dialogs->show(10211);
+				_vm->_dialogs->show(10212);
+				break;
+
+			default:
+				break;
+			}
+
+			if (resetFrame >= 0) {
+				if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) {
+					_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+					_diaryFrame = resetFrame;
+				}
+			}
+		}
+	}
+
+	if ((_animRunning == 2) && _scene->_animation[_globals._animationIndexes[0]]) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) {
+			_diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+			resetFrame = -1;
+
+			switch (_diaryFrame) {
+			case 6:
+				_scene->deleteSequence(_globals._sequenceIndexes[2]);
+				_game.syncTimers(1, _globals._sequenceIndexes[2], 3, _globals._animationIndexes[0]);
+				break;
+
+			case 26:
+				_vm->_dialogs->show(10213);
+				_vm->_dialogs->show(10214);
+				break;
+
+			default:
+				break;
+			}
+
+			if (resetFrame >= 0) {
+				if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) {
+					_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+					_diaryFrame = resetFrame;
+				}
+			}
+		}
+	}
+
+	if (_game._trigger >= 70) {
+		switch (_game._trigger) {
+		case 70:
+			_scene->deleteSequence(_globals._sequenceIndexes[6]);
+			_vm->_sound->command(25);
+			_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 9, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 71);
+			break;
+
+		case 71: {
+			int idx = _globals._sequenceIndexes[6];
+			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], -2);
+			_game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx);
+			_game._player._stepEnabled = true;
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+}
+
+void Scene102::actions() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10201);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], true, 8, 2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7],true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 2, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 3);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[6]);
+			_vm->_sound->command(24);
+			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
+			break;
+
+		case 2: {
+			int idx = _globals._sequenceIndexes[6];
+			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 5);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+			_game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx);
+			}
+			break;
+
+		case 3:
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+			_game._player.walk(Common::Point(0, 130), FACING_WEST);
+			_game._player._walkOffScreenSceneId = 101;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) {
+		_scene->_nextSceneId = 103;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_DIARIES) || _action.isAction(VERB_OPEN, NOUN_DIARIES)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_animRunning = 1;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('B',-1), 1);
+			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			break;
+
+		case 1:
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12);
+			_diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST);
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			_scene->_sequences.setTimingTrigger(6, 2);
+			break;
+
+		case 2:
+			_game._player.walk(Common::Point(51, 121), FACING_NORTHWEST);
+			_game._player.setWalkTrigger(3);
+			break;
+
+		case 3:
+			_game._player._visible = false;
+			_animRunning = 2;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 4);
+			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			break;
+
+		case 4:
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12);
+			_diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST);
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FIREPLACE)) {
+			_vm->_dialogs->show(10202);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BED)) {
+			_vm->_dialogs->show(10203);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SHUTTERS)) {
+			_vm->_dialogs->show(10204);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RUG)) {
+			_vm->_dialogs->show(10206);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOOKCASE)) {
+			_vm->_dialogs->show(10208);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DIARIES)) {
+			_vm->_dialogs->show(10209);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) {
+			_vm->_dialogs->show(10215);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOWERS)) {
+			_vm->_dialogs->show(10216);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WINDOW)) {
+			_vm->_dialogs->show(10217);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WOOD_BASKET)) {
+			_vm->_dialogs->show(10219);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FIREPLACE_SCREEN)) {
+			_vm->_dialogs->show(10220);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_NIGHTSTAND)) {
+			_vm->_dialogs->show(10222);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) {
+			_vm->_dialogs->show(10223);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHEST)) {
+			_vm->_dialogs->show(10224);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TAPESTRY)) {
+			_vm->_dialogs->show(10226);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SCONCE)) {
+			_vm->_dialogs->show(10227);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(10228);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(10229);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DECORATION)) {
+			_vm->_dialogs->show(10230);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(10231);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CHEST)) {
+		_vm->_dialogs->show(10224);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_FLOWERS)) {
+		_vm->_dialogs->show(10225);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_WINDOW)) {
+		_vm->_dialogs->show(10218);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) {
+		_vm->_dialogs->show(10221);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_SHUTTERS)) {
+		_vm->_dialogs->show(10205);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PULL, NOUN_RUG)) {
+		_vm->_dialogs->show(10207);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene102::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Dragonsphere
 } // End of namespace MADS
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h
index 023a789..ac82669 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.h
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.h
@@ -64,6 +64,24 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene102 : public Scene1xx {
+private:
+	int _diaryHotspotIdx1;
+	int _diaryHotspotIdx2;
+	int _diaryFrame;
+	int _animRunning;
+
+public:
+	Scene102(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Dragonsphere
 } // End of namespace MADS
 


Commit: d26bc1937dbb7aedd2b11f729e3e114fbf38d608
    https://github.com/scummvm/scummvm/commit/d26bc1937dbb7aedd2b11f729e3e114fbf38d608
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-23T10:50:55+02:00

Commit Message:
MADS: Dragon: Implement scene 103

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes.cpp
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/dragonsphere/dragonsphere_scenes1.h



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
index c0781f5..23647ed 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
@@ -47,7 +47,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 102:	// queen's bedroom
 		return new Scene102(vm);
 	case 103:	// outside king's bedroom
-		return new DummyScene(vm);	// TODO
+		return new Scene103(vm);
 	case 104:	// fireplace / bookshelf
 		return new DummyScene(vm);	// TODO
 	case 105:	// dining room
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 5b5aa72..14849fa 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -272,9 +272,9 @@ void Scene102::enter() {
 	_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6", false);
 	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2), false);
 
-	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 0, 0);
-	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 0, 0);
-	_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0, 0, 0);
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0);
+	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0);
+	_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0);
 
 	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12);
@@ -663,5 +663,400 @@ void Scene102::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene103::Scene103(MADSEngine *vm) : Scene1xx(vm) {
+}
+
+void Scene103::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+}
+
+void Scene103::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene103::enter() {
+	_vm->_disableFastwalk = true;
+
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('y', 1), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('y', 2), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 7), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('y', 0), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 3), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 4), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('y', 5), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('y', 6), false);
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites("*KGRD_9", false);
+
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 0);
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0, 4);
+	_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0, 0);
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 0);
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 3);
+	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 2);
+	_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 0, 0);
+	_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 0, 5);
+
+	if ((_scene->_priorSceneId == 104) || (_scene->_priorSceneId == 105)) {
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
+	}
+
+	if (_scene->_priorSceneId == 102) {
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+		_scene->setCamera(Common::Point(320, 0));
+		_game._player.walk(Common::Point(482, 128), FACING_SOUTH);
+		_game._player.firstWalk(Common::Point(471, 108), FACING_SOUTH, Common::Point(482, 128), FACING_SOUTH, false);
+		_game._player.setWalkTrigger(72);
+	} else if (_scene->_priorSceneId == 104) {
+		_game._player._playerPos = Common::Point(130, 152);
+		_game._player._facing = FACING_NORTHEAST;
+	} else if (_scene->_priorSceneId == 105) {
+		_game._player._playerPos = Common::Point(517, 152);
+		_game._player._facing = FACING_NORTHWEST;
+		_scene->setCamera(Common::Point(320, 0));
+	} else if ((_scene->_priorSceneId == 101) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
+		_game._player.firstWalk(Common::Point(173, 108), FACING_SOUTH, Common::Point(162, 127), FACING_SOUTH, false);
+		_game._player.setWalkTrigger(70);
+	} else {
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene103::step() {
+	switch (_game._trigger) {
+	case 70:
+		_scene->deleteSequence(_globals._sequenceIndexes[9]);
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 3);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 71);
+		break;
+
+	case 71: {
+		int tmpIdx = _globals._sequenceIndexes[9];
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
+		_game.syncTimers(1, _globals._sequenceIndexes[9], 1, tmpIdx);
+		_game._player._stepEnabled = true;
+		}
+		break;
+
+	case 72:
+		_scene->deleteSequence(_globals._sequenceIndexes[10]);
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 3);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 73);
+		break;
+
+	case 73: {
+		int tmpIdx = _globals._sequenceIndexes[10];
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
+		_game.syncTimers(1, _globals._sequenceIndexes[10], 1, tmpIdx);
+		_game._player._stepEnabled = true;
+		}
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene103::actions() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10301);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 7, 2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11],true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 2, 2, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 3);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[9]);
+			_vm->_sound->command(24);
+			_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 2);
+			break;
+
+		case 2: {
+			int tmpIdx = _globals._sequenceIndexes[9];
+			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
+			_game.syncTimers(1, _globals._sequenceIndexes[9], 1, tmpIdx);
+			}
+			break;
+
+		case 3:
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[11]);
+			_scene->_sequences.setTimingTrigger(1,4);
+			break;
+
+		case 4:
+			_game._player.walk(Common::Point(173, 108), FACING_NORTH);
+			_game._player.setWalkTrigger(5);
+			break;
+
+		case 5:
+			_scene->deleteSequence(_globals._sequenceIndexes[9]);
+			_vm->_sound->command(25);
+			_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 6);
+			break;
+
+		case 6: {
+			int tmpIdx = _globals._sequenceIndexes[9];
+			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+			_game.syncTimers(1, _globals._sequenceIndexes[9], 1, tmpIdx);
+			_scene->_sequences.setTimingTrigger(6, 7);
+			}
+			break;
+
+		case 7:
+			_scene->_nextSceneId = 101;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_QUEENS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_QUEENS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_QUEENS_ROOM)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], true, 7, 2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11],true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 2, 2, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 3);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[10]);
+			_vm->_sound->command(24);
+			_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 7, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 2);
+			break;
+
+		case 2: {
+			int tmpIdx = _globals._sequenceIndexes[10];
+			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+			_game.syncTimers(1, _globals._sequenceIndexes[10], 1, tmpIdx);
+			}
+			break;
+
+		case 3:
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[11]);
+			_scene->_sequences.setTimingTrigger(1,4);
+			break;
+
+		case 4:
+			_game._player.walk(Common::Point(471, 108), FACING_NORTH);
+			_game._player.setWalkTrigger(5);
+			break;
+
+		case 5:
+			_scene->deleteSequence(_globals._sequenceIndexes[10]);
+			_vm->_sound->command(25);
+			_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 7, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 6);
+			break;
+
+		case 6: {
+			int tmpIdx = _globals._sequenceIndexes[10];
+			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+			_game.syncTimers(1, _globals._sequenceIndexes[10], 1, tmpIdx);
+			_scene->_sequences.setTimingTrigger(6, 7);
+			}
+			break;
+
+		case 7:
+			_scene->_nextSceneId = 102;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_MEETING_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_MEETING_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_MEETING_ROOM)) {
+		_scene->_nextSceneId = 104;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_BALLROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_BALLROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_BALLROOM)) {
+		_scene->_nextSceneId = 105;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_TAPESTRY)) {
+			if ((_scene->_customDest.x <= 75) && (_scene->_customDest.y <= 130))
+				_vm->_dialogs->show(10302);
+			else
+				_vm->_dialogs->show(10303);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_COAT_OF_ARMS)) {
+			_vm->_dialogs->show(10305);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_QUEENS_ROOM)) {
+			_vm->_dialogs->show(10307);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) {
+			_vm->_dialogs->show(10308);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEDAR_CHEST)) {
+			_vm->_dialogs->show(10309);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TABLE)) {
+			_vm->_dialogs->show(10311);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SMALL_WINDOW)) {
+			_vm->_dialogs->show(10312);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LARGE_WINDOW)) {
+			_vm->_dialogs->show(10314);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BATTLE_AXES)) {
+			_vm->_dialogs->show(10315);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BUST_ON_WALL)) {
+			_vm->_dialogs->show(10317);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DECORATION)) {
+			_vm->_dialogs->show(10320);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL_PLAQUE)) {
+			_vm->_dialogs->show(10322);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_BALLROOM)) {
+			_vm->_dialogs->show(10323);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_MEETING_ROOM)) {
+			_vm->_dialogs->show(10324);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if ((_action.isAction(VERB_TAKE) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_BATTLE_AXES)) {
+		_vm->_dialogs->show(10316);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TAPESTRY)) {
+		_vm->_dialogs->show(10304);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PULL, NOUN_COAT_OF_ARMS)) {
+		_vm->_dialogs->show(10306);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_CEDAR_CHEST)) {
+		_vm->_dialogs->show(10310);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_SMALL_WINDOW) || _action.isAction(VERB_OPEN, NOUN_LARGE_WINDOW)) {
+		_vm->_dialogs->show(10313);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene103::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Dragonsphere
 } // End of namespace MADS
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h
index ac82669..9e723ca 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.h
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.h
@@ -82,6 +82,18 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene103 : public Scene1xx {
+public:
+	Scene103(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Dragonsphere
 } // End of namespace MADS
 


Commit: 85c45c210ea3939f34dd0921590d08f9053d9e77
    https://github.com/scummvm/scummvm/commit/85c45c210ea3939f34dd0921590d08f9053d9e77
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-24T12:38:31+02:00

Commit Message:
MADS: Dragon: Implement scene 104

Changed paths:
    engines/mads/conversations.cpp
    engines/mads/conversations.h
    engines/mads/dragonsphere/dragonsphere_scenes.cpp
    engines/mads/dragonsphere/dragonsphere_scenes.h
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/dragonsphere/dragonsphere_scenes1.h
    engines/mads/dragonsphere/game_dragonsphere.h



diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp
index 6b1b44d..10ce41d 100644
--- a/engines/mads/conversations.cpp
+++ b/engines/mads/conversations.cpp
@@ -44,6 +44,7 @@ struct ConvData {
 GameConversation::GameConversation(MADSEngine *vm)
 	: _vm(vm) {
 	_running = _restoreRunning = 0;
+	_nextStartNode = nullptr;
 }
 
 GameConversation::~GameConversation() {
@@ -142,4 +143,11 @@ void GameConversation::release() {
 	warning("TODO: GameConversation::release");
 }
 
+void GameConversation::reset(int id) {
+	warning("TODO: GameConversation::reset");
+}
+
+void GameConversation::abortConv() {
+	warning("TODO: GameConversation::abort");
+}
 } // End of namespace MADS
diff --git a/engines/mads/conversations.h b/engines/mads/conversations.h
index 48d054f..c4bf06e 100644
--- a/engines/mads/conversations.h
+++ b/engines/mads/conversations.h
@@ -42,6 +42,7 @@ public:
 	 */
 	virtual ~GameConversation();
 
+	int* _nextStartNode;
 	int* getVariable(int idx);
 
 	void get(int id);
@@ -53,6 +54,8 @@ public:
 	void setInterlocutorTrigger(int val);
 	void hold();
 	void release();
+	void reset(int id);
+	void abortConv();
 
 	int _running;
 	int _restoreRunning;
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
index 23647ed..b43f7af 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
@@ -49,7 +49,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 103:	// outside king's bedroom
 		return new Scene103(vm);
 	case 104:	// fireplace / bookshelf
-		return new DummyScene(vm);	// TODO
+		return new Scene104(vm);
 	case 105:	// dining room
 		return new DummyScene(vm);	// TODO
 	case 106:	// throne room
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.h b/engines/mads/dragonsphere/dragonsphere_scenes.h
index a3bc22c..e9b4871 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.h
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.h
@@ -50,6 +50,17 @@ enum Verb {
 	VERB_LOOK_AT = 0x1E,
 	VERB_WALK_THROUGH = 0x25,
 	VERB_WALK_INTO = 0x27,
+	VERB_INVOKE = 0x2F,
+	VERB_ATTACK = 0x39,
+	VERB_CARVE_UP = 0x3A,
+	VERB_THRUST = 0x57,
+	VERB_POUR = 0x62,
+	VERB_POUR_CONTENTS_OF = 0x63,
+	VERB_DRINK = 0x64,
+	VERB_SHIFT_SELF = 0x73,
+	VERB_SHIFT_INTO_BEAR = 0x74,
+	VERB_SHIFT_INTO_SEAL = 0x75,
+	VERB_SHIFT_INTO_SNAKE = 0x76,
 	VERB_WALK_DOWN = 0xA9,
 	VERB_WALK = 0x1CB,
 	VERB_WALK_AROUND = 0x221
@@ -86,7 +97,6 @@ enum Noun {
 	NOUN_BUST_ON_WALL = 0x2C,
 	NOUN_WALL_ARCH = 0x2D,
 	NOUN_SIGNET_RING = 0x2E,
-	NOUN_INVOKE = 0x2F,
 	NOUN_POLISH = 0x30,
 	NOUN_GANGBANG = 0x31,
 	NOUN_BIRD_FIGURINE = 0x32,
@@ -96,8 +106,6 @@ enum Noun {
 	NOUN_MAKE_NOISE = 0x36,
 	NOUN_SHIELDSTONE = 0x37,
 	NOUN_SWORD = 0x38,
-	NOUN_ATTACK = 0x39,
-	NOUN_CARVE_UP = 0x3A,
 	NOUN_GOBLET = 0x3B,
 	NOUN_FILL = 0x3C,
 	NOUN_DRINK_FROM = 0x3D,
@@ -126,7 +134,6 @@ enum Noun {
 	NOUN_MAGIC_BELT = 0x54,
 	NOUN_ADJUST = 0x55,
 	NOUN_AMULET = 0x56,
-	NOUN_THRUST = 0x57,
 	NOUN_MUD = 0x58,
 	NOUN_FEEL = 0x59,
 	NOUN_TASTE = 0x5A,
@@ -137,9 +144,6 @@ enum Noun {
 	NOUN_FLASK = 0x5F,
 	NOUN_FLASK_FULL_OF_ACID = 0x60,
 	NOUN_POUR_CONTENTS = 0x61,
-	NOUN_POUR = 0x62,
-	NOUN_POUR_CONTENTS_OF = 0x63,
-	NOUN_DRINK = 0x64,
 	NOUN_ROPE = 0x65,
 	NOUN_TIE = 0x66,
 	NOUN_POWER_VACUUM_STONE = 0x67,
@@ -154,10 +158,6 @@ enum Noun {
 	NOUN_BLACK_SPHERE = 0x70,
 	NOUN_SOPTUS_SOPORIFIC = 0x71,
 	NOUN_SHIFTER_RING = 0x72,
-	NOUN_SHIFT_SELF = 0x73,
-	NOUN_SHIFT_INTO_BEAR = 0x74,
-	NOUN_SHIFT_INTO_SEAL = 0x75,
-	NOUN_SHIFT_INTO_SNAKE = 0x76,
 	NOUN_REVERT = 0x77,
 	NOUN_MEDICINE_BUNDLE = 0x78,
 	NOUN_SHAKE = 0x79,
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 14849fa..61e64b5 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -409,7 +409,7 @@ void Scene102::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], true, 8, 2);
-			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7],true);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 2, 1);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 3);
 			break;
@@ -795,7 +795,7 @@ void Scene103::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 7, 2);
-			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11],true);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 2, 2, 1);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 3);
 			break;
@@ -861,7 +861,7 @@ void Scene103::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], true, 7, 2);
-			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11],true);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 2, 2, 1);
 			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 3);
 			break;
@@ -1058,5 +1058,1993 @@ void Scene103::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene104::Scene104(MADSEngine *vm) : Scene1xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+	_anim4ActvFl = false;
+	_anim5ActvFl = false;
+	_activateTimerFl = false;
+	_wasBearFl = false;
+	_amuletWorksFl = false;
+	_pidDrawnSword = false;
+	_anim6ActvFl = false;
+
+	_animationRunning = -1;
+	_deathTimer = -1;
+	_deathFrame = -1;
+	_doorwayHotspotId = -1;
+
+	_kingStatus = -1;
+	_kingFrame = -1;
+	_kingCount = -1;
+	_macCount = -1;
+	_macFrame = -1;
+	_macStatus = -1;
+	_queenStatus = -1;
+	_queenFrame = -1;
+	_queenCount = -1;
+	_pidStatus = -1;
+	_pidFrame = -1;
+	_pidCount = -1;
+	_twinklesFrame = -1;
+	_twinklesStatus = -1;
+	_twinklesCount = -1;
+
+	_tapestryFrame = -1;
+	_clock = -1;
+}
+
+void Scene104::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_anim3ActvFl);
+	s.syncAsByte(_anim4ActvFl);
+	s.syncAsByte(_anim5ActvFl);
+	s.syncAsByte(_activateTimerFl);
+	s.syncAsByte(_wasBearFl);
+	s.syncAsByte(_amuletWorksFl);
+	s.syncAsByte(_pidDrawnSword);
+	s.syncAsByte(_anim6ActvFl);
+
+	s.syncAsSint16LE(_animationRunning);
+	s.syncAsSint16LE(_deathTimer);
+	s.syncAsSint16LE(_deathFrame);
+	s.syncAsSint16LE(_doorwayHotspotId);
+
+	s.syncAsSint16LE(_kingStatus);
+	s.syncAsSint16LE(_kingFrame);
+	s.syncAsSint16LE(_kingCount);
+	s.syncAsSint16LE(_queenStatus);
+	s.syncAsSint16LE(_queenFrame);
+	s.syncAsSint16LE(_queenCount);
+	s.syncAsSint16LE(_macStatus);
+	s.syncAsSint16LE(_macFrame);
+	s.syncAsSint16LE(_macCount);
+	s.syncAsSint16LE(_pidStatus);
+	s.syncAsSint16LE(_pidFrame);
+	s.syncAsSint16LE(_pidCount);
+	s.syncAsSint16LE(_twinklesStatus);
+	s.syncAsSint16LE(_twinklesFrame);
+	s.syncAsSint16LE(_twinklesCount);
+
+	s.syncAsSint16LE(_tapestryFrame);
+	s.syncAsSint32LE(_clock);
+}
+
+void Scene104::setup() {
+	if (_scene->_currentSceneId == 119)
+		_globals[kNoLoadWalker] = true;
+
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_DOORWAY);
+	_scene->addActiveVocab(NOUN_QUEEN_MOTHER);
+	_scene->addActiveVocab(NOUN_KING);
+}
+
+void Scene104::enter() {
+	_vm->_gameConv->get(1);
+
+	if (_globals[kPlayerPersona] == 1) {
+		_scene->_sprites.addSprites(formAnimName('e', 8), false);
+		_scene->_sprites.addSprites(formAnimName('b', 5), false);
+	}
+
+	_scene->_hotspots.activate(NOUN_MACMORN, false);
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_animationRunning = 0;
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+		_anim3ActvFl = false;
+		_anim4ActvFl = false;
+		_anim5ActvFl = false;
+		_kingCount = 0;
+		_macCount = 0;
+		_queenCount = 0;
+		_twinklesCount = 0;
+		_deathTimer = 0;
+		_clock = 0;
+		_activateTimerFl = false;
+		_wasBearFl = false;
+		_amuletWorksFl = false;
+		_pidDrawnSword = false;
+	}
+
+	_anim6ActvFl = false;
+
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), false);
+
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
+	if (_globals[kNoLoadWalker]) {
+		_scene->drawToBackground(_globals._spriteIndexes[6], 5, Common::Point(-32000, -32000), 0, 100);
+		_scene->_sprites.remove(_globals._spriteIndexes[6]);
+	}
+
+	if (_globals[kPlayerPersona] == 0) {
+		_scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(139, 132));
+
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_8", false);
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM1_8", false);
+		_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('y', 5), false);
+		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4), false);
+		_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('y', 1), false);
+
+		if (_globals[kTapestryStatus] == 0 || _globals[kTapestryStatus] == 2) {
+			_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
+			_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
+			_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6);
+		} else {
+			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
+			_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70));
+		}
+
+		if (_globals[kBooksStatus] == 1 || _globals[kBooksStatus] == 3) {
+			if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3)
+				_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
+		} else if (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4) {
+			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+
+			if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) {
+				_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
+				_scene->_hotspots.activate(NOUN_SECRET_DOOR, true);
+			}
+		}
+	} else {
+		_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('e', 5), false);
+		_scene->_sprites.addSprites(formAnimName('b', 0), false);
+		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('b', 3), false);
+		_scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(140, 107));
+		_scene->_hotspots.activateAtPos(NOUN_TABLE, true, Common::Point(139, 132));
+		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4), false);
+
+		if (_globals[kNoLoadWalker]) {
+			_scene->drawToBackground(_globals._spriteIndexes[10], 1, Common::Point(-32000, -32000), 0, 100);
+			_scene->_sprites.remove(_globals._spriteIndexes[10]);
+		}
+
+		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('y', 3), false);
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+		_doorwayHotspotId = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, SYNTAX_SINGULAR, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(_doorwayHotspotId, Common::Point(295, 145), FACING_NORTHEAST);
+
+		_globals[kBooksStatus] = 0;
+		_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70));
+	}
+
+	if (_globals[kBooksStatus] == 0)
+		_scene->_hotspots.activate(NOUN_BOOKS, false);
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 5);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0);
+	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0);
+
+
+	if (_globals[kPlayerPersona] == 0) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
+	}
+
+	if (_scene->_priorSceneId == 106) {
+		_game._player._playerPos = Common::Point(201, 152);
+		_game._player._facing = FACING_NORTHWEST;
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+	} else if ((_scene->_priorSceneId == 119) || (_scene->_priorSceneId == 104)) {
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
+		_scene->_sequences.setTimingTrigger(60, 77);
+
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0);
+		_anim0ActvFl = true;
+		_kingStatus = 2;
+		_scene->setAnimFrame(_globals._animationIndexes[0], 22);
+
+		_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('q', 1), 0);
+		_anim2ActvFl = true;
+		_queenStatus = 0;
+
+		_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6);
+
+		_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 1), 79);
+
+		int idx = _scene->_dynamicHotspots.add(NOUN_QUEEN_MOTHER, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+		_scene->setDynamicAnim(idx, _globals._animationIndexes[2], 0);
+
+		_scene->_hotspots.activate(NOUN_MACMORN, true);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_KING, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+		_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0);
+	} else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+		_game._player.firstWalk(Common::Point(77, 93), FACING_SOUTH, Common::Point(74, 107), FACING_SOUTH, false);
+		_game._player.setWalkTrigger(70);
+	} else if (_globals[kNoLoadWalker]) {
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0);
+		_anim0ActvFl = true;
+		_kingStatus = 0;
+		_scene->setAnimFrame(_globals._animationIndexes[0], 14);
+
+		_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('q', 1), 0);
+		_anim2ActvFl = true;
+		_queenStatus = 0;
+
+		_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0);
+		_anim4ActvFl = true;
+		_pidStatus = 0;
+		if (_amuletWorksFl)
+			_scene->setAnimFrame(_globals._animationIndexes[4], 89);
+
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0);
+		_anim1ActvFl = true;
+		_macStatus = 0;
+		_scene->setAnimFrame(_globals._animationIndexes[1], 25);
+
+		int idx = _scene->_dynamicHotspots.add(NOUN_QUEEN_MOTHER, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+		_scene->setDynamicAnim(idx, _globals._animationIndexes[2], 0);
+
+		_scene->_hotspots.activate(NOUN_MACMORN, true);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_KING, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+		_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0);
+
+		if (_vm->_gameConv->_restoreRunning == 1) {
+			_game._player._stepEnabled = false;
+			_vm->_gameConv->run(1);
+			_vm->_gameConv->exportValue(0);
+			_vm->_gameConv->exportValue(0);
+			_vm->_gameConv->exportValue(0);
+			if (_globals[kLlanieStatus] != 2)
+				_vm->_gameConv->exportValue(1);
+			else
+				_vm->_gameConv->exportValue(0);
+		} else {
+			_activateTimerFl = true;
+			_deathTimer = 0;
+			_clock = 0;
+			_game._player._stepEnabled = true;
+		}
+	} else {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 12);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene104::step() {
+	if (_anim0ActvFl)
+		handleKingAnimation();
+
+	if (_anim1ActvFl)
+		handleMacAnimation1();
+
+	if (_anim2ActvFl)
+		handleQueenAnimation();
+
+	if (_anim3ActvFl)
+		handleTwinklesAnimation();
+
+	if (_anim4ActvFl)
+		handlePidAnimation();
+
+	if (_anim5ActvFl)
+		handleMacAnimation2();
+
+	if (_anim6ActvFl)
+		handleDeathAnimation();
+
+	if ((_animationRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _tapestryFrame) {
+			_tapestryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+			int resetFrame = -1;
+
+			if (_tapestryFrame == 13) {
+				_game._player._visible = true;
+				_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			}
+
+			if ((resetFrame >= 0) && (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame())) {
+				_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+				_tapestryFrame = resetFrame;
+			}
+		}
+	}
+
+	switch (_game._trigger) {
+	case 70:
+		_scene->deleteSequence(_globals._sequenceIndexes[6]);
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 71);
+		break;
+
+	case 71: {
+		int idx = _globals._sequenceIndexes[6];
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+		_game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx);
+		_game._player._stepEnabled = true;
+		}
+		break;
+	}
+
+	if (_game._trigger == 77)
+		_kingStatus = 0;
+
+	if (_game._trigger == 79) {
+		_scene->freeAnimation(_globals._animationIndexes[4]);
+
+		_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0);
+		_anim4ActvFl = true;
+		_pidStatus = 0;
+		_game.syncTimers(3, _globals._animationIndexes[4], 4, 0);
+
+		_scene->deleteSequence(_globals._sequenceIndexes[14]);
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0);
+		_anim1ActvFl = true;
+		_macStatus = 0;
+
+		_game._player._stepEnabled = false;
+		_vm->_gameConv->run(1);
+		_vm->_gameConv->exportValue(0);
+		_vm->_gameConv->exportValue(0);
+		_vm->_gameConv->exportValue(0);
+
+		if (_globals[kLlanieStatus] != 2)
+			_vm->_gameConv->exportValue(1);
+		else
+			_vm->_gameConv->exportValue(0);
+	}
+
+	if (_game._trigger == 85) {
+		_vm->_sound->command(100);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+	}
+
+	if (_activateTimerFl) {
+		long clockDiff = _scene->_frameStartTime - _clock;
+		if ((clockDiff >= 0) && (clockDiff <= 4))
+			_deathTimer += clockDiff;
+		else
+			_deathTimer += 1;
+
+		_clock = _scene->_frameStartTime;
+
+		if (_deathTimer >= 1300) {
+			_activateTimerFl = false;
+			if (_pidDrawnSword) {
+				_pidStatus = 6;
+				_vm->_gameConv->run(1);
+				_vm->_gameConv->exportValue(0);
+				_vm->_gameConv->exportValue(1);
+				_vm->_gameConv->exportValue(0);
+				if (_globals[kLlanieStatus] != 2)
+					_vm->_gameConv->exportValue(1);
+				else
+					_vm->_gameConv->exportValue(0);
+				_vm->_gameConv->hold();
+			} else
+				_pidStatus = 8;
+
+			_game._player._stepEnabled = false;
+		}
+	}
+
+
+	if ((_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3)
+		&& (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4))
+		_globals[kCanViewCrownHole] = true;
+
+	if (_game._trigger == 95) {
+		_vm->_gameConv->reset(1);
+		_vm->_dialogs->show(10466);
+		_globals[kNoLoadWalker] = false;
+		_scene->_nextSceneId = 119;
+	}
+}
+
+void Scene104::actions() {
+	if (_vm->_gameConv->_running == 1) {
+		handleFinalConversation();
+		goto handled;
+	}
+
+	if (_action._lookFlag) {
+		if (_globals[kPlayerPersona] == 0)
+			_vm->_dialogs->show(10401);
+		else
+			_vm->_dialogs->show(10437);
+
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) {
+		if (_globals[kPlayerPersona] == 0)
+			_scene->_nextSceneId = 106;
+		else
+			_vm->_dialogs->show(10434);
+
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) {
+		if (_globals[kPlayerPersona] == 0) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 8, 2);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 2, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 3);
+				break;
+
+			case 1:
+				_scene->deleteSequence(_globals._sequenceIndexes[6]);
+				_vm->_sound->command(24);
+				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
+				break;
+
+			case 2: {
+				int tmpIdx = _globals._sequenceIndexes[6];
+				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx);
+				}
+				break;
+
+			case 3:
+				_game._player._visible = true;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+				_scene->_sequences.setTimingTrigger(1,4);
+				break;
+
+			case 4:
+				_game._player.walk(Common::Point(77, 93), FACING_NORTH);
+				_game._player.setWalkTrigger(5);
+				break;
+
+			case 5:
+				_scene->deleteSequence(_globals._sequenceIndexes[6]);
+				_vm->_sound->command(25);
+				_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 7, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 6);
+				break;
+
+			case 6: {
+				int tmpIdx = _globals._sequenceIndexes[6];
+				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx);
+				_scene->_sequences.setTimingTrigger(6, 7);
+				}
+				break;
+
+			case 7:
+				_scene->_nextSceneId = 103;
+				break;
+
+			default:
+				break;
+			}
+		} else
+			_vm->_dialogs->show(10434);
+
+		goto handled;
+	}
+
+	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE) || _action.isAction(VERB_OPEN)) && _action.isObject(NOUN_BOOKS)) {
+		if ((_globals[kBooksStatus] == 1) || (_globals[kBooksStatus] == 3) || _game._trigger) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 3, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 3);
+				break;
+
+			case 1:
+				_globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[12], 0, 0, 2);
+				break;
+
+			case 2: {
+				int tmpIdx = _globals._sequenceIndexes[12];
+				_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2);
+				_game.syncTimers(1, _globals._sequenceIndexes[12], 1, tmpIdx);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+				if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) {
+					_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
+					_scene->_hotspots.activate(NOUN_SECRET_DOOR, true);
+				}
+				}
+				break;
+
+			case 3:
+				_game._player._visible = true;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_scene->_sequences.setTimingTrigger(5, 4);
+				break;
+
+			case 4:
+				if (_globals[kBooksStatus] == 1) {
+					_globals[kPlayerScore] += 2;
+					_globals[kBooksStatus] = 2;
+					if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3))
+						_vm->_dialogs->show(10428);
+					else {
+						_vm->_sound->command(94);
+						_vm->_sound->command(67);
+						_vm->_dialogs->show(10427);
+					}
+				} else {
+					_vm->_sound->command(94);
+					_vm->_sound->command(67);
+					_globals[kBooksStatus] = 4;
+				}
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			goto handled;
+		}
+	}
+
+	if (_action.isAction(VERB_PUSH, NOUN_BOOKS)) {
+		if ((_globals[kBooksStatus] == 2) || (_globals[kBooksStatus] == 4)) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 3, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 3);
+				break;
+
+			case 1:
+				_vm->_sound->command(94);
+				_vm->_sound->command(67);
+				_scene->deleteSequence(_globals._sequenceIndexes[12]);
+				_globals._sequenceIndexes[12] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[12], false, 6, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+				_scene->_sequences.setTimingTrigger(6, 2);
+				break;
+
+			case 2:
+				if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) {
+					_scene->_hotspots.activate(NOUN_WALL_PANEL, true);
+					_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
+				}
+				break;
+
+			case 3:
+				_game._player._visible = true;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_scene->_sequences.setTimingTrigger(5, 4);
+				break;
+
+			case 4:
+				if (_globals[kBooksStatus] == 2)
+					_vm->_dialogs->show(10429);
+				_globals[kBooksStatus] = 3;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			goto handled;
+		}
+	}
+
+	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) {
+		if (_globals[kPlayerPersona] == 0) {
+			if (_scene->_customDest.x >= 279) {
+				if ((_globals[kTapestryStatus] == 0) || (_globals[kTapestryStatus] == 2)) {
+					switch (_game._trigger) {
+					case 0:
+						_scene->deleteSequence(_globals._sequenceIndexes[11]);
+						_game._player._stepEnabled = false;
+						_game._player._visible = false;
+						_animationRunning = 1;
+						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a',-1), 1);
+						break;
+
+					case 1:
+						_game._player._visible = true;
+						_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+						_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
+						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(290, 20));
+						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70));
+						if ((_globals[kBooksStatus] == 2) || (_globals[kBooksStatus] == 4)) {
+							_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
+							_scene->_hotspots.activate(NOUN_SECRET_DOOR, true);
+						} else {
+							_scene->_hotspots.activate(NOUN_WALL_PANEL, true);
+							_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
+						}
+						_scene->_sequences.setTimingTrigger(6, 2);
+						break;
+
+					case 2:
+						if (_globals[kTapestryStatus] == 0) {
+							_globals[kTapestryStatus] = 1;
+							_globals[kPlayerScore] += 2;
+							if (_globals[kBooksStatus] == 0 || _globals[kBooksStatus] == 1 || _globals[kBooksStatus] == 3)
+								_vm->_dialogs->show(10424);
+							else if (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4)
+								_vm->_dialogs->show(10425);
+						} else
+							_globals[kTapestryStatus] = 3;
+
+						_game._player._stepEnabled = true;
+						break;
+
+					default:
+						break;
+					}
+				}
+			} else
+				_vm->_dialogs->show(10404);
+		} else
+			_vm->_dialogs->show(10445);
+
+		goto handled;
+	}
+
+	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) {
+		if (_globals[kPlayerPersona] == 0) {
+			if (_scene->_customDest.x >= 279) {
+				if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) {
+					switch (_game._trigger) {
+					case 0:
+						_game._player._stepEnabled = false;
+						_game._player._visible = false;
+						_scene->deleteSequence(_globals._sequenceIndexes[10]);
+						_animationRunning = 2;
+						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d',-1), 1);
+						break;
+
+					case 1:
+						_game._player._visible = true;
+						_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+						_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6);
+						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(290, 20));
+						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(310, 70));
+						_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
+						_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
+						_scene->_sequences.setTimingTrigger(6, 2);
+						break;
+
+					case 2:
+						_globals[kTapestryStatus] = 2;
+						_game._player._stepEnabled = true;
+						break;
+
+					default:
+						break;
+					}
+					goto handled;
+				}
+			}
+		} else {
+			_vm->_dialogs->show(10445);
+			goto handled;
+		}
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_BOOKS) || _action.isObject(NOUN_BOOKSHELF)) {
+			if (_globals[kPlayerPersona] == 0) {
+				switch (_globals[kBooksStatus]) {
+				case 0:
+					_scene->_hotspots.activate(NOUN_BOOKS, true);
+					_globals[kBooksStatus] = 1;
+					_vm->_dialogs->show(10418);
+					goto handled;
+
+				case 1:
+					_vm->_dialogs->show(10418);
+					goto handled;
+
+				case 2:
+				case 4:
+					_vm->_dialogs->show(10419);
+					goto handled;
+
+				case 3:
+					_vm->_dialogs->show(10420);
+					goto handled;
+
+				default:
+					break;
+				}
+			} else {
+				_vm->_dialogs->show(10439);
+				goto handled;
+			}
+		}
+
+		if (_action.isObject(NOUN_FIREPLACE)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10402);
+			else
+				_vm->_dialogs->show(10438);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_TAPESTRY)) {
+			if (_globals[kPlayerPersona] == 0) {
+				if (_scene->_customDest.x >= 209 && _scene->_customDest.x <= 278)
+					_vm->_dialogs->show(10403);
+				else if (_scene->_customDest.x >= 107 && _scene->_customDest.x <= 190)
+						_vm->_dialogs->show(10422);
+				else if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3)
+					_vm->_dialogs->show(10460);
+				else
+					_vm->_dialogs->show(10423);
+			} else
+				_vm->_dialogs->show(10439);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_RUG)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10405);
+			else
+				_vm->_dialogs->show(10439);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_FIREPLACE_SCREEN)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10407);
+			else
+				_vm->_dialogs->show(10439);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10409);
+			else
+				_vm->_dialogs->show(10434);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_SCONCE)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10410);
+			else
+				_vm->_dialogs->show(10440);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_WOOD_BASKET)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10411);
+			else
+				_vm->_dialogs->show(10439);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_TROPHY)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10412);
+			else
+				_vm->_dialogs->show(10441);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_READING_BENCH)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10414);
+			else
+				_vm->_dialogs->show(10439);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_LOVESEAT)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10416);
+			else
+				_vm->_dialogs->show(10439);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) {
+			if (_globals[kPlayerPersona] == 0)
+				_vm->_dialogs->show(10421);
+			else
+				_vm->_dialogs->show(10434);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_SECRET_DOOR)) {
+			_vm->_dialogs->show(10430);
+			goto handled;
+		}
+
+		if ((_action.isObject(NOUN_DOORWAY) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_OPEN, NOUN_DOORWAY)) && (_globals[kPlayerPersona] == 1)) {
+			_vm->_dialogs->show(10432);
+			goto handled;
+		}
+
+		if (_action.isAction(VERB_LOOK, NOUN_WALL_PANEL)) {
+			if ((_globals[kBooksStatus] == 0) || (_globals[kBooksStatus] == 1))
+				_vm->_dialogs->show(10435);
+			else
+				_vm->_dialogs->show(10436);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_KING) && _globals[kPlayerPersona] == 1) {
+			_vm->_dialogs->show(10443);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) {
+			_vm->_dialogs->showItem(OBJ_MAGIC_MUSIC_BOX, 843, 0);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_MACMORN) && (_globals[kPlayerPersona] == 1)) {
+			_vm->_dialogs->show(10444);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_TABLE)) {
+			if (_globals[kPlayerPersona] == 1)
+				_vm->_dialogs->show(10455);
+			else if (_scene->_customDest.x < 174)
+				_vm->_dialogs->show(10451);
+			else
+				_vm->_dialogs->show(10448);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_DECORATION)) {
+			if (_globals[kPlayerPersona] == 1)
+				_vm->_dialogs->show(10439);
+			else
+				_vm->_dialogs->show(10449);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_SWORD)) {
+			if (_globals[kPlayerPersona] == 1)
+				_vm->_dialogs->show(10439);
+			else
+				_vm->_dialogs->show(10450);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_FLOOR) && (_globals[kPlayerPersona] == 1)) {
+			_vm->_dialogs->show(10439);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_WALL) && (_globals[kPlayerPersona] == 1)) {
+			_vm->_dialogs->show(10439);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CANDLESTICK)) {
+			if (_globals[kPlayerPersona] == 1)
+				_vm->_dialogs->show(10439);
+			else
+				_vm->_dialogs->show(10461);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_QUEEN_MOTHER)) {
+			_vm->_dialogs->show(10456);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_MACMORN)) {
+			_vm->_dialogs->show(10444);
+			goto handled;
+		}
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_RUG)) {
+		if (_globals[kPlayerPersona] == 0)
+			_vm->_dialogs->show(10406);
+		else
+			_vm->_dialogs->show(10445);
+
+		goto handled;
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) {
+		if (_globals[kPlayerPersona] == 0)
+			_vm->_dialogs->show(10408);
+		else
+			_vm->_dialogs->show(10445);
+
+		goto handled;
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TROPHY)) {
+		if (_globals[kPlayerPersona] == 0)
+			_vm->_dialogs->show(10413);
+		else
+			_vm->_dialogs->show(10445);
+
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_READING_BENCH)) {
+		if (_globals[kPlayerPersona] == 0)
+			_vm->_dialogs->show(10415);
+		else
+			_vm->_dialogs->show(10445);
+
+		goto handled;
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_LOVESEAT)) {
+		if (_globals[kPlayerPersona] == 0)
+			_vm->_dialogs->show(10417);
+		else
+			_vm->_dialogs->show(10445);
+
+		goto handled;
+	}
+
+	if ((_action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && (_action.isObject(NOUN_SECRET_DOOR) || _action.isObject(NOUN_WALL_PANEL))) {
+		_vm->_dialogs->show(10431);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_INVOKE, NOUN_SIGNET_RING) && (_globals[kPlayerPersona] == 1)) {
+		_vm->_dialogs->show(10433);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_PUT, NOUN_TENTACLE_PARTS, NOUN_WALL_PANEL) && (_globals[kPlayerPersona] == 0)) {
+		_vm->_dialogs->show(10446);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_SHIFT_INTO_BEAR) && _anim0ActvFl) {
+		if (_wasBearFl)
+			_vm->_dialogs->show(10457);
+		else if (_amuletWorksFl)
+			_vm->_dialogs->show(10459);
+		else {
+			_wasBearFl = true;
+			_globals[kPlayerScore] += 2;
+			_vm->_gameConv->run(1);
+			_vm->_gameConv->exportValue(1);
+			_vm->_gameConv->exportValue(0);
+			_vm->_gameConv->exportValue(0);
+			if (_globals[kLlanieStatus] != 2)
+				_vm->_gameConv->exportValue(1);
+			else
+				_vm->_gameConv->exportValue(0);
+		}
+		goto handled;
+	}
+
+	if ((_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_TAKE, NOUN_SWORD)) && _anim0ActvFl) {
+		_activateTimerFl = false;
+		_pidStatus = 6;
+
+		if (!_amuletWorksFl) {
+			_globals[kPlayerScore] += 5;
+			_vm->_gameConv->run(1);
+			_vm->_gameConv->exportValue(0);
+			_vm->_gameConv->exportValue(1);
+			_vm->_gameConv->exportValue(0);
+			if (_globals[kLlanieStatus] != 2)
+				_vm->_gameConv->exportValue(1);
+			else
+				_vm->_gameConv->exportValue(0);
+
+			_vm->_gameConv->hold();
+		} else {
+			_macStatus = 6;
+			_game._player._stepEnabled = false;
+		}
+		_amuletWorksFl = true;
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_INVOKE, NOUN_AMULET) && _anim0ActvFl) {
+		if (_amuletWorksFl) {
+			_activateTimerFl = false;
+			_pidStatus = 5;
+			_globals[kPlayerScore] += 15;
+			_globals[kAmuletStatus] = 2;
+			_game._player._stepEnabled = false;
+
+			_scene->freeAnimation(_globals._animationIndexes[1]);
+
+			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6);
+			_game.syncTimers(1, _globals._sequenceIndexes[14], 4, 0);
+
+			_globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('e', 3), 0x1000 | 0x2000);
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 2), 0);
+			_anim1ActvFl = false;
+			_anim5ActvFl = true;
+		} else
+			_vm->_dialogs->showItem(OBJ_AMULET, 945, 0);
+
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_QUEEN_MOTHER)) {
+		_vm->_dialogs->show(10458);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_MACMORN)) {
+		_vm->_dialogs->show(10464);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_QUEEN_MOTHER)) {
+		_vm->_dialogs->show(10463);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_KING)) {
+		_vm->_dialogs->show(10465);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_POUR_CONTENTS_OF, NOUN_MACMORN)) {
+		_vm->_dialogs->show(10462);
+		goto handled;
+	}
+
+
+	if (_anim2ActvFl && (_action.isAction(VERB_WALK_ACROSS) || _action.isAction(VERB_WALK_TO))) {
+		_vm->_dialogs->show(10445);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CANDLESTICK)) {
+		_vm->_dialogs->show(10468);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) {
+		_vm->_dialogs->show(10470);
+		goto handled;
+	}
+
+	goto done;
+
+handled:
+	_action._inProgress = false;
+
+done:
+	;
+}
+
+void Scene104::preActions() {
+	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH))
+	 && _action.isObject(NOUN_TAPESTRY) && (_scene->_customDest.x > 280))
+		_game._player.walk(Common::Point(295, 145), FACING_NORTHEAST);
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM)
+	 || _action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY)
+	 || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)
+	 || ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY))
+	 || ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY))
+	 || ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL))
+		 && (_action.isObject(NOUN_RUG) || _action.isObject(NOUN_FIREPLACE_SCREEN) || _action.isObject(NOUN_TROPHY) || _action.isObject(NOUN_LOVESEAT)))
+	 || _action.isAction(VERB_OPEN, NOUN_READING_BENCH)) {
+		if (_globals[kPlayerPersona] == 1)
+			_game._player.cancelWalk();
+	}
+
+	if (_globals[kNoLoadWalker])
+		_game._player._needToWalk = false;
+}
+
+void Scene104::handleFinalConversation() {
+	bool interlocutorFl = false;
+	bool heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 11:
+		_deathTimer = 0;
+		_clock = 0;
+		_activateTimerFl = true;
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 14:
+		if (!_game._trigger)
+			_macStatus = 3;
+
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 17:
+		_pidStatus = 3;
+		_vm->_gameConv->hold();
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 20:
+		if (!_game._trigger)
+			_macStatus = 2;
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 30:
+		*_vm->_gameConv->_nextStartNode = 31;
+		_vm->_gameConv->abortConv();
+
+		if (_globals[kLlanieStatus] == 2) {
+			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('l', 1), 0);
+			_anim3ActvFl = true;
+			_twinklesStatus = 1;
+		}
+		break;
+
+	case 38:
+		_globals[kEndOfGame] = true;
+		_scene->_nextSceneId = 106;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 81:
+		switch (_action._activeAction._verbId) {
+		case 0:
+		case 2:
+		case 4:
+		case 5:
+		case 7:
+		case 8:
+		case 11:
+		case 17:
+			if (_macStatus == 0)
+				_macStatus = 1;
+
+			_pidStatus = 0;
+			if (_queenStatus != 2)
+				_queenStatus = 0;
+
+			_kingStatus = 0;
+			break;
+
+		case 1:
+		case 3:
+		case 6:
+		case 20:
+		case 22:
+		case 24:
+		case 26:
+		case 28:
+		case 32:
+		case 34:
+		case 39:
+		case 41:
+		case 43:
+			_kingStatus = 1;
+			_pidStatus = 0;
+			if (_queenStatus != 2)
+				_queenStatus = 0;
+
+			if (_macStatus == 1)
+				_macStatus = 0;
+
+			break;
+
+		case 21:
+		case 23:
+		case 25:
+		case 27:
+		case 35:
+		case 40:
+		case 42:
+			if (_queenStatus != 2)
+				_queenStatus = 1;
+
+			_pidStatus = 0;
+			if (_macStatus == 1)
+				_macStatus = 0;
+
+			_kingStatus = 0;
+			break;
+
+		case 31:
+		case 33:
+			_twinklesStatus = 1;
+			_pidStatus = 0;
+			if (_queenStatus != 2)
+				_queenStatus = 0;
+
+			if (_macStatus == 1)
+				_macStatus = 0;
+
+			_kingStatus = 0;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 83:
+		if ((_action._activeAction._verbId == 8) || (_action._activeAction._verbId == 11))
+			_pidStatus = 2;
+		else
+			_pidStatus = 1;
+
+		if (_macStatus == 1)
+			_macStatus = 0;
+
+		if (_queenStatus != 2)
+			_queenStatus = 0;
+
+		_kingStatus = 0;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(83);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(81);
+
+	_kingCount = 0;
+	_queenCount = 0;
+	_macCount = 0;
+	_twinklesCount = 0;
+	_pidCount = 0;
+}
+
+void Scene104::handleKingAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _kingFrame)
+		return;
+
+	_kingFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_kingFrame) {
+	case 14:
+	case 21:
+		switch (_kingStatus) {
+		case 0:
+			if (_kingCount > _vm->getRandomNumber(40, 50)) {
+				_kingCount = 0;
+				if (_vm->getRandomNumber(1,2) == 1)
+					resetFrame = 13;
+				else
+					resetFrame = 14;
+			} else {
+				++_kingCount;
+				resetFrame = 13;
+			}
+			break;
+
+		case 1:
+			resetFrame = 14;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 16:
+	case 17:
+	case 18:
+	case 19:
+		switch (_kingStatus) {
+		case 0:
+			if (_kingCount > _vm->getRandomNumber(40, 50)) {
+				_kingCount = 0;
+				if (_vm->getRandomNumber(1,2) == 1)
+					resetFrame = 15;
+				else
+					resetFrame = 19;
+			} else {
+				++_kingCount;
+				resetFrame = 15;
+			}
+			break;
+
+		case 1:
+			resetFrame = _vm->getRandomNumber(16, 18);
+			++_kingCount;
+			if (_kingCount > 15) {
+				_kingStatus = 0;
+				_kingCount = 0;
+				resetFrame = 15;
+			}
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 22:
+		if (_kingStatus == 2)
+			resetFrame = 21;
+		else
+			resetFrame = 0;
+
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_kingFrame = resetFrame;
+	}
+}
+
+
+void Scene104::handleMacAnimation1() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _macFrame)
+		return;
+
+	_macFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_macFrame) {
+	case 1:
+	case 2:
+	case 7:
+		switch (_macStatus) {
+		case 0:
+			resetFrame = 0;
+			break;
+
+		case 1:
+			if (_macCount == 0) {
+				if (_vm->getRandomNumber(1,2) == 1)
+					resetFrame = 2;
+				else
+					resetFrame = 1;
+
+				++_macCount;
+			} else {
+				resetFrame = _vm->getRandomNumber(0, 1);
+				++_macCount;
+				if (_macCount > 15) {
+					_macStatus = 0;
+					_macCount = 0;
+					resetFrame = 0;
+				}
+			}
+			break;
+
+		case 2:
+			resetFrame = 90;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 3:
+	case 4:
+	case 5:
+		switch (_macStatus) {
+		case 0:
+		case 2:
+		case 3:
+		case 4:
+			resetFrame = 5;
+			break;
+
+		case 1:
+			if (_macCount == 0) {
+				if (_vm->getRandomNumber(1,2) == 1)
+					resetFrame = 5;
+				else
+					resetFrame = 3;
+
+				++_macCount;
+
+			} else {
+				resetFrame = _vm->getRandomNumber(3, 4);
+				++_macCount;
+				if (_macCount > 15) {
+					_macStatus = 0;
+					_macCount = 0;
+					resetFrame = 5;
+				}
+			}
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 25:
+		_game._player._stepEnabled = true;
+		break;
+
+	case 26:
+	case 90:
+	case 174:
+		switch (_macStatus) {
+		case 3:
+			resetFrame = 76;
+			_macStatus = 0;
+			_game._player._stepEnabled = false;
+			break;
+
+		case 4:
+			break;
+
+		case 5:
+			resetFrame = 147;
+			_macStatus = 0;
+			break;
+
+		case 6:
+			_pidFrame = 105;
+			resetFrame = 26;
+			_scene->setAnimFrame(_globals._animationIndexes[4], 105);
+			_game.syncTimers(3, _globals._animationIndexes[4], 3, _globals._animationIndexes[1]);
+			break;
+
+		default:
+			resetFrame = 25;
+			break;
+		}
+		break;
+
+	case 36:
+		_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 13);
+		break;
+
+	case 37:
+		_scene->setAnimFrame(_globals._animationIndexes[4], 89);
+		_pidFrame = 89;
+		_pidStatus = 7;
+		_game.syncTimers(3, _globals._animationIndexes[4], 3, _globals._animationIndexes[1]);
+		break;
+
+	case 76:
+		_vm->_gameConv->reset(1);
+		_vm->_dialogs->show(10467);
+		_globals[kNoLoadWalker] = false;
+		_scene->_nextSceneId = 119;
+		break;
+
+	case 82:
+		_pidStatus = 4;
+		break;
+
+	case 97:
+		_activateTimerFl = true;
+		_scene->deleteSequence(_globals._sequenceIndexes[5]);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 85);
+		break;
+
+	case 112:
+		resetFrame = 8;
+		_macStatus = 0;
+		break;
+
+	case 162:
+		_vm->_gameConv->release();
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_macFrame = resetFrame;
+	}
+}
+
+
+void Scene104::handleMacAnimation2() {
+
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _macFrame)
+		return;
+
+	_macFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_macFrame) {
+	case 1:
+		if (_macStatus != 4)
+			resetFrame = 0;
+		break;
+
+	case 2:
+		_scene->deleteSequence(_globals._sequenceIndexes[14]);
+		_game.syncTimers(1, _globals._sequenceIndexes[14], 3, _globals._animationIndexes[1]);
+		break;
+
+	case 37:
+		_scene->freeAnimation(_globals._animationIndexes[1]);
+		_scene->_sprites.remove(_globals._spriteIndexes[15]);
+		_anim5ActvFl = false;
+		resetFrame = -1;
+
+		_vm->_dialogs->show(10426);
+		_vm->_sound->command(45);
+		_vm->_gameConv->run(1);
+		_vm->_gameConv->exportValue(0);
+		_vm->_gameConv->exportValue(0);
+		_vm->_gameConv->exportValue(1);
+		if (_globals[kLlanieStatus] != 2)
+			_vm->_gameConv->exportValue(1);
+		else
+			_vm->_gameConv->exportValue(0);
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_macFrame = resetFrame;
+	}
+}
+
+void Scene104::handleQueenAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _queenFrame)
+		return;
+
+	_queenFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_queenFrame) {
+	case 1:
+	case 8:
+	case 15:
+	case 24:
+		switch (_queenStatus) {
+		case 0:
+			if (_queenCount > _vm->getRandomNumber(40, 50)) {
+				_queenCount = 0;
+				if (_vm->getRandomNumber(1,2) == 1)
+					resetFrame = 0;
+				else
+					resetFrame = 8;
+			} else {
+				++_queenCount;
+				resetFrame = 0;
+			}
+			break;
+
+		case 1:
+			if (_vm->getRandomNumber(1,2) == 1)
+				resetFrame = 1;
+			else
+				resetFrame = 15;
+
+			_queenStatus = 0;
+			break;
+
+		case 2:
+			resetFrame = 8;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 12:
+	case 29:
+		switch (_queenStatus) {
+		case 0:
+			if (_queenCount > _vm->getRandomNumber(40, 50)) {
+				_queenCount = 0;
+				if (_vm->getRandomNumber(1,2) == 1)
+					resetFrame = 11;
+				else
+					resetFrame = 12;
+			} else {
+				++_queenCount;
+				resetFrame = 11;
+			}
+			break;
+
+		case 1:
+			resetFrame = 12;
+			break;
+
+		case 2:
+			resetFrame = 24;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 27:
+		switch (_queenStatus) {
+		case 0:
+		case 1:
+			resetFrame = 27;
+			break;
+
+		case 2:
+			resetFrame = 26;
+			break;
+
+		case 3:
+			resetFrame = 27;
+			_queenStatus = 0;
+			break;
+
+		default:
+			break;
+		}
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
+		_queenFrame = resetFrame;
+	}
+}
+
+void Scene104::handleTwinklesAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _twinklesFrame)
+		return;
+
+	_twinklesFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_twinklesFrame) {
+	case 1:
+		if (_twinklesStatus == 2)
+			resetFrame = 0;
+		break;
+
+	case 10:
+		_queenStatus = 2;
+		break;
+
+	case 28:
+		_vm->_gameConv->run(1);
+		_vm->_gameConv->exportValue(0);
+		_vm->_gameConv->exportValue(0);
+		_vm->_gameConv->exportValue(1);
+		if (_globals[kLlanieStatus] != 2)
+			_vm->_gameConv->exportValue(1);
+		else
+			_vm->_gameConv->exportValue(0);
+		break;
+
+	case 36:
+		_queenStatus = 3;
+		break;
+
+	case 37:
+	case 38:
+	case 47:
+		switch (_twinklesStatus) {
+		case 0:
+			if (_twinklesFrame != 37 && _twinklesFrame != 38)
+				_twinklesFrame = 38;
+
+			if (_twinklesCount > _vm->getRandomNumber(40, 50)) {
+				_twinklesCount = 0;
+				if (_vm->getRandomNumber(1, 2) == 1)
+					resetFrame = 36;
+				else
+					resetFrame = 37;
+			} else {
+				++_twinklesCount;
+				resetFrame = _twinklesFrame - 1;
+			}
+			break;
+
+		case 1:
+			resetFrame = 38;
+			_twinklesStatus = 0;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[3], resetFrame);
+		_twinklesFrame = resetFrame;
+	}
+}
+
+void Scene104::handleDeathAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _deathFrame)
+		return;
+
+	_deathFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	if (_deathFrame == 11)
+		_scene->playSpeech(7);
+	else if (_deathFrame == 17)
+		_scene->playSpeech(6);
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[4], resetFrame);
+		_deathFrame = resetFrame;
+	}
+}
+
+void Scene104::handlePidAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _pidFrame)
+		return;
+
+	_pidFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_pidFrame) {
+	case 1:
+	case 2:
+	case 3:
+	case 9:
+	case 47:
+	case 81:
+		switch (_pidStatus) {
+		case 0:
+			resetFrame = 0;
+			break;
+
+		case 1:
+			resetFrame = _vm->getRandomNumber(0, 2);
+			++_pidCount;
+			if (_pidCount > 20) {
+				_pidStatus = 0;
+				_pidCount = 0;
+				resetFrame = 0;
+			}
+			break;
+
+		case 2:
+			resetFrame = 3;
+			break;
+
+		case 3:
+			_activateTimerFl = false;
+			resetFrame = 10;
+			break;
+
+		case 5:
+			_game._player._stepEnabled = false;
+			_activateTimerFl = false;
+			resetFrame = 47;
+			_pidStatus = 0;
+			break;
+
+		case 6:
+			resetFrame = 81;
+			break;
+
+		case 8:
+			_scene->freeAnimation(_globals._animationIndexes[1]);
+			_scene->freeAnimation(_globals._animationIndexes[4]);
+			_anim1ActvFl = false;
+			_anim4ActvFl = false;
+			_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('d', 2), 95);
+			_anim6ActvFl = true;
+			_game.syncTimers(3, _globals._animationIndexes[4], 4, 0);
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 4:
+	case 5:
+	case 6:
+	case 7:
+		if (_pidStatus == 2) {
+			resetFrame = _vm->getRandomNumber(4, 6);
+			++_pidCount;
+			if (_pidCount > 20) {
+				_pidStatus = 0;
+				_pidCount = 0;
+				resetFrame = 7;
+			}
+		} else
+			resetFrame = 7;
+		break;
+
+	case 24:
+		_vm->_gameConv->release();
+		break;
+
+	case 25:
+		if (_pidStatus == 4) {
+			resetFrame = 25;
+			_pidStatus = 0;
+		} else
+			resetFrame = 24;
+		break;
+
+	case 46:
+		_activateTimerFl = true;
+		_clock = 0;
+		_deathTimer = 0;
+		_game._player._stepEnabled = true;
+		break;
+
+	case 60:
+		resetFrame = 107;
+		break;
+
+	case 62:
+		_macStatus = 4;
+		break;
+
+	case 88:
+		if (_deathTimer < 1300)
+			_macStatus = 5;
+		break;
+
+	case 89:
+		if (_pidStatus == 5) {
+			resetFrame = 55;
+			_pidStatus = 0;
+		} else if (_deathTimer >= 1300)
+			_macStatus = 6;
+		else {
+			_pidDrawnSword = true;
+			resetFrame = 88;
+		}
+		break;
+
+	case 91:
+		_scene->playSpeech(7);
+		break;
+
+	case 95:
+		_scene->playSpeech(6);
+		break;
+
+	case 105:
+		resetFrame = 104;
+		break;
+
+	case 106:
+		if (_pidStatus == 7)
+			resetFrame = 89;
+		else
+			resetFrame = 105;
+		break;
+
+	case 111:
+		resetFrame = 60;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[4], resetFrame);
+		_pidFrame = resetFrame;
+	}
+}
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Dragonsphere
 } // End of namespace MADS
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h
index 9e723ca..9b56e84 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.h
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.h
@@ -94,6 +94,63 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene104 : public Scene1xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _anim3ActvFl;
+	bool _anim4ActvFl;
+	bool _anim5ActvFl;
+	bool _anim6ActvFl;
+	bool _activateTimerFl;
+	bool _wasBearFl;
+	bool _amuletWorksFl;
+	bool _pidDrawnSword;
+	int _animationRunning;
+	int _deathTimer;
+	int _deathFrame;
+	int _doorwayHotspotId;
+
+	int _kingStatus;
+	int _kingFrame;
+	int _kingCount;
+	int _queenStatus;
+	int _queenFrame;
+	int _queenCount;
+	int _pidStatus;
+	int _pidFrame;
+	int _pidCount;
+	int _macStatus;
+	int _macFrame;
+	int _macCount;
+	int _twinklesStatus;
+	int _twinklesFrame;
+	int _twinklesCount;
+	int _tapestryFrame;
+
+	int32 _clock;
+
+	void handleFinalConversation();
+	void handleKingAnimation();
+	void handleMacAnimation1();
+	void handleMacAnimation2();
+	void handleQueenAnimation();
+	void handleTwinklesAnimation();
+	void handleDeathAnimation();
+	void handlePidAnimation();
+
+public:
+	Scene104(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Dragonsphere
 } // End of namespace MADS
 
diff --git a/engines/mads/dragonsphere/game_dragonsphere.h b/engines/mads/dragonsphere/game_dragonsphere.h
index 290c38d..b9eb86a 100644
--- a/engines/mads/dragonsphere/game_dragonsphere.h
+++ b/engines/mads/dragonsphere/game_dragonsphere.h
@@ -80,7 +80,7 @@ enum InventoryObject {
 	OBJ_DIAMOND_DUST = 40,
 	OBJ_RUBY_RING = 41,
 	OBJ_GOLD_NUGGET = 42,
-	OBJ_MUSIC_BOX = 43,
+	OBJ_MAGIC_MUSIC_BOX = 43,
 	OBJ_EMERALD = 44,
 	OBJ_PARCHMENT = 45,
 	OBJ_GAME = 46,


Commit: 3e979e59ef18b1189b3810ef332da7bb492a418a
    https://github.com/scummvm/scummvm/commit/3e979e59ef18b1189b3810ef332da7bb492a418a
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-24T14:38:19+03:00

Commit Message:
MADS: More work on V2 conversations

Most of the conversation data has been figured out, with a few TODOs
left

Changed paths:
    engines/mads/conversations.cpp



diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp
index 10ce41d..d45d498 100644
--- a/engines/mads/conversations.cpp
+++ b/engines/mads/conversations.cpp
@@ -24,27 +24,61 @@
 #include "mads/mads.h"
 #include "mads/compression.h"
 #include "common/file.h"
+#include "common/util.h"	// for Common::hexdump
 
 namespace MADS {
 
+#define MAX_SPEAKERS 5
+
+enum DialogCommands {
+	cmdNodeEnd = 0,
+	//
+	cmdHide = 2,
+	cmdUnhide = 3,
+	cmdMessage = 4,
+	//
+	//
+	cmdGoto = 7,
+	//
+	cmdAssign = 9,
+	cmdDialogEnd = 255
+};
+
+struct ConvDialog {
+	int16 textLineIndex;	// 0-based
+	int16 speechIndex;		// 1-based
+	uint16 nodeOffset;		// offset in section 6
+	uint16 nodeSize;		// size in section 6
+};
+
+struct ConvNode {
+	uint16 index;
+	uint16 dialogCount;
+	int16 unk1;
+	int16 unk2;
+	int16 unk3;
+
+	Common::Array<ConvDialog> dialogs;
+};
+
 struct ConvData {
-	uint16 nodes;
-	uint16 unk1;
-	uint16 messages;
+	uint16 nodeCount;		// conversation nodes, each one containing several dialog options and messages
+	uint16 dialogCount;		// messages (non-selectable) + texts (selectable)
+	uint16 messageCount;	// messages (non-selectable)
+	uint16 textLineCount;
 	uint16 unk2;
-	uint16 unk3;
-	uint16 imports;
-	uint16 speakers;
-	Common::List<Common::String> portraits;
+	uint16 importCount;
+	uint16 speakerCount;
+	Common::String portraits[MAX_SPEAKERS];
+	bool speakerExists[MAX_SPEAKERS];
 	Common::String speechFile;
+	Common::Array<Common::String> textLines;
+	Common::Array<ConvNode> convNodes;
 };
 
-#define MAX_SPEAKERS 5
-
 GameConversation::GameConversation(MADSEngine *vm)
 	: _vm(vm) {
 	_running = _restoreRunning = 0;
-	_nextStartNode = nullptr;
 }
 
 GameConversation::~GameConversation() {
@@ -53,6 +87,8 @@ GameConversation::~GameConversation() {
 void GameConversation::get(int id) {
 	Common::File inFile;
 	Common::String fileName = Common::String::format("CONV%03d.CNV", id);
+	// TODO: Also handle the .CND file
+
 	inFile.open(fileName);
 	MadsPack convFileUnpacked(&inFile);
 	Common::SeekableReadStream *convFile = convFileUnpacked.getItemStream(0);
@@ -61,48 +97,205 @@ void GameConversation::get(int id) {
 
 	ConvData conv;
 
-	// Section 0: Header
-	conv.nodes = convFile->readUint16LE();
-	conv.unk1 = convFile->readUint16LE();
-	conv.messages = convFile->readUint16LE();
+	// **** Section 0: Header *************************************************
+	conv.nodeCount = convFile->readUint16LE();
+	conv.dialogCount = convFile->readUint16LE();
+	conv.messageCount = convFile->readUint16LE();
+	conv.textLineCount = convFile->readUint16LE();
 	conv.unk2 = convFile->readUint16LE();
-	conv.unk3 = convFile->readUint16LE();
-	conv.imports = convFile->readUint16LE();
-	conv.speakers = convFile->readUint16LE();
+	conv.importCount = convFile->readUint16LE();
+	conv.speakerCount = convFile->readUint16LE();
 
-	debug("Conv %d has %d nodes, %d messages, %d imports and %d speakers", id, conv.nodes, conv.messages, conv.imports, conv.speakers);
+	//debug("Conv %d has %d nodes, %d dialogs, %d messages, %d text lines, %d unk2, %d imports and %d speakers",
+	//		id, conv.nodeCount, conv.dialogCount, conv.messageCount, conv.textLineCount, conv.unk2, conv.importCount, conv.speakerCount);
 
 	for (uint16 i = 0; i < MAX_SPEAKERS; i++) {
 		convFile->read(buffer, 16);
-		Common::String portrait = buffer;
-		debug("Speaker %d, portrait %s", i, portrait.c_str());
-		conv.portraits.push_back(portrait);
+		conv.portraits[i] = buffer;
+		//debug("Speaker %d, portrait %s", i, conv.portraits[i].c_str());
 	}
 
 	for (uint16 i = 0; i < MAX_SPEAKERS; i++) {
-		convFile->skip(2);
+		conv.speakerExists[i] = convFile->readUint16LE();
+		//debug("Speaker %d exists: %d", i, conv.speakerExists[i]);
 	}
 
 	convFile->read(buffer, 14);
 	conv.speechFile = Common::String(buffer);
-	debug("Speech file %s", conv.speechFile.c_str());
+	//debug("Speech file %s", conv.speechFile.c_str());
 
-	convFile->skip(32);	// unknown bytes
+	uint16 textLength = convFile->readUint16LE();	// Total text length in section 5
+	convFile->skip(2);	// TODO: unknown
+	uint16 commandLength = convFile->readUint16LE();	// Total length of commands in section 6
+	//debug("Node entry commands length: %d", commandLength);
 
-	// Section 1
+	/*debug("Section 0 unknown bytes");
+	byte *tmp0 = new byte[26];
+	convFile->read(tmp0, 26);
+	Common::hexdump(tmp0, 26);
+	delete[] tmp0;*/
+	
+	// **** Section 1: Nodes **************************************************
 	convFile = convFileUnpacked.getItemStream(1);
 
-	for (uint16 i = 0; i < conv.nodes; i++) {
-		uint16 nodeIndex = convFile->readUint16LE();
-		debug("Node %d, index %d", i, nodeIndex);
-		convFile->skip(2);	// 01 00
-		convFile->skip(6);
+	for (uint16 i = 0; i < conv.nodeCount; i++) {
+		ConvNode node;
+		node.index = convFile->readUint16LE();
+		node.dialogCount = convFile->readUint16LE();
+		node.unk1 = convFile->readSint16LE();	// TODO
+		node.unk2 = convFile->readSint16LE();	// TODO
+		node.unk3 = convFile->readSint16LE();	// TODO
+		conv.convNodes.push_back(node);
+		//debug("Node %d, index %d, entries %d - %d, %d, %d", i, node.index, node.dialogCount, node.unk1, node.unk2, node.unk3);
 	}
 
-	// TODO: Read the rest of the sections
+	// **** Section 2: Dialogs ************************************************
+	convFile = convFileUnpacked.getItemStream(2);
+	assert(convFile->size() == conv.dialogCount * 8);
+
+	for (uint16 i = 0; i < conv.nodeCount; i++) {
+		uint16 dialogCount = conv.convNodes[i].dialogCount;
+
+		for (uint16 j = 0; j < dialogCount; j++) {
+			ConvDialog dialog;
+			dialog.textLineIndex = convFile->readSint16LE();
+			dialog.speechIndex = convFile->readSint16LE();
+			dialog.nodeOffset = convFile->readUint16LE();
+			dialog.nodeSize = convFile->readUint16LE();
+			conv.convNodes[i].dialogs.push_back(dialog);
+			//debug("Node %d, dialog %d: text line %d, speech index %d, node offset %d, node size %d", j, i, dialog.textLineIndex, dialog.speechIndex, dialog.nodeOffset, dialog.nodeSize);
+		}
+	}
+
+	// **** Section 3: ???? ***************************************************
+	/*debug("Section 3");
+	convFile = convFileUnpacked.getItemStream(3);
+	byte *tmp1 = new byte[convFile->size()];
+	convFile->read(tmp1, convFile->size());
+	Common::hexdump(tmp1, convFile->size());
+	delete[] tmp1;*/
+	// TODO
+
+	// **** Section 4: Text line offsets **************************************
+	convFile = convFileUnpacked.getItemStream(4);
+	assert(convFile->size() == conv.textLineCount * 2);
+
+	uint16 *textLineOffsets = new uint16[conv.textLineCount];	// deleted below in section 5
+	for (uint16 i = 0; i < conv.textLineCount; i++)
+		textLineOffsets[i] = convFile->readUint16LE();
+
+	// **** Section 5: Text lines *********************************************
+	convFile = convFileUnpacked.getItemStream(5);
+	assert(convFile->size() == textLength);
+
+	Common::String textLine;
+	conv.textLines.resize(conv.textLineCount);
+	char textLineBuffer[256];
+	uint16 nextOffset;
+	for (uint16 i = 0; i < conv.textLineCount; i++) {
+		nextOffset = (i != conv.textLineCount - 1) ? textLineOffsets[i + 1] : convFile->size();
+		convFile->read(textLineBuffer, nextOffset - textLineOffsets[i]);
+		conv.textLines[i] = Common::String(textLineBuffer);	
+		//debug("Text line %d: %s", i, conv.textLines[i].c_str());
+	}
+
+	delete[] textLineOffsets;
+
+	// **** Section 6: Node entry commands ************************************
+	convFile = convFileUnpacked.getItemStream(6);
+	assert(convFile->size() == commandLength);
+
+	for (uint16 i = 0; i < conv.nodeCount; i++) {
+		uint16 dialogCount = conv.convNodes[i].dialogCount;
+
+		for (uint16 j = 0; j < dialogCount; j++) {
+			//ConvDialog dialog = conv.convNodes[i].dialogs[j];
+			byte command;
+			uint16 chk;
+
+			do {
+				command = convFile->readByte();
+				chk = convFile->readUint16BE();
+				if (chk != 0xFF00 && chk != 0x0000) {
+					warning("Error while reading conversation node entries - bailing out");
+					break;
+				}
+
+				switch (command) {
+				case cmdNodeEnd:
+					//debug("Node end");
+					break;
+				case cmdDialogEnd:
+					//debug("Dialog end");
+					break;
+				case cmdHide: {
+					byte count = convFile->readByte();
+					for (byte k = 0; k < count; k++) {
+						/*uint16 nodeRef = */convFile->readUint16LE();
+						//debug("Hide node %d", nodeRef);
+					}
+
+					}
+					break;
+				case cmdUnhide: {
+					byte count = convFile->readByte();
+					for (byte k = 0; k < count; k++) {
+						/*uint16 nodeRef = */convFile->readUint16LE();
+						//debug("Unhide node %d", nodeRef);
+					}
+
+					}
+					break;
+				case cmdMessage:
+					//debug("Message");
+					convFile->skip(7);	// TODO
+					break;
+				case cmdGoto: {
+					convFile->skip(3);	// unused?
+					/*byte nodeRef = */convFile->readByte();
+					//debug("Goto %d", nodeRef);
+					}
+					break;
+				case cmdAssign: {
+					convFile->skip(3);	// unused?
+					/*uint16 value = */convFile->readUint16LE();
+					/*uint16 variable = */convFile->readUint16LE();
+					//debug("Variable %d = %d", variable, value);
+					}
+					break;
+				default:
+					error("Unknown conversation command %d", command);
+					break;
+				}
+			} while (command != cmdNodeEnd && command != cmdDialogEnd);
+		}
+	}
 
 	inFile.close();
 
+	/*
+	// DEBUG: Show the very first message, and play the very first speech
+	_vm->_audio->setSoundGroup(conv.speechFile);
+	uint16 firstText = 0, firstSpeech = 1;
+
+	for (uint16 i = 0; i < conv.convNodes.size(); i++) {
+		for (uint16 k = 0; k < conv.convNodes[i].dialogs.size(); k++) {
+			if (conv.convNodes[i].dialogs[k].textLineIndex >= 0) {
+				firstText = conv.convNodes[i].dialogs[k].textLineIndex;
+				firstSpeech = conv.convNodes[i].dialogs[k].speechIndex;
+				break;
+			}
+		}
+	}
+
+	_vm->_audio->playSound(firstSpeech - 1);
+
+	TextDialog *dialog = new TextDialog(_vm, FONT_INTERFACE, Common::Point(0, 100), 30);
+	dialog->addLine(conv.textLines[firstText]);
+	dialog->show();
+	delete dialog;
+	*/
+
 	warning("TODO GameConversation::get");
 }
 


Commit: 6fc4d504433281f6f378235031378bb4bdf4af00
    https://github.com/scummvm/scummvm/commit/6fc4d504433281f6f378235031378bb4bdf4af00
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-24T14:41:01+03:00

Commit Message:
MADS: Phantom: Add hack in setHeroTrigger to stop conversations

This allows the conversation in Phantom scene 101 to close, and enables
player actions for the scene

Changed paths:
    engines/mads/conversations.cpp



diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp
index d45d498..86f38b2 100644
--- a/engines/mads/conversations.cpp
+++ b/engines/mads/conversations.cpp
@@ -316,6 +316,8 @@ void GameConversation::exportValue(int val) {
 }
 
 void GameConversation::setHeroTrigger(int val) {
+	_vm->_game->_trigger = val;	// HACK
+	_running = -1;	// HACK
 	warning("TODO: GameConversation::setHeroTrigger");
 }
 


Commit: 86722cc41f17608cd0272496e01239684bc2899f
    https://github.com/scummvm/scummvm/commit/86722cc41f17608cd0272496e01239684bc2899f
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-10-24T14:43:36+03:00

Commit Message:
MADS: Phantom: Initial implementation of Player::setWalkTrigger()

Changed paths:
    engines/mads/player.cpp
    engines/mads/player.h



diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index 1e9ce7e..638cc69 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -82,7 +82,8 @@ Player::Player(MADSEngine *vm)
 	_forcePrefix = false;
 	_commandsAllowed = false;
 	_enableAtTarget = false;
-
+	_walkTrigger = 0;
+	 
 	Common::fill(&_stopWalkerList[0], &_stopWalkerList[12], 0);
 	Common::fill(&_stopWalkerTrigger[0], &_stopWalkerTrigger[12], 0);
 	Common::fill(&_spriteSetsPresent[0], &_spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT], false);
@@ -188,8 +189,10 @@ void Player::changeFacing() {
 		(Facing)_directionListIndexes[_facing + 10];
 	selectSeries();
 
-	if ((_facing == _turnToFacing) && !_moving)
+	if ((_facing == _turnToFacing) && !_moving) {
 		updateFrame();
+		activateTrigger();
+	}
 
 	_priorTimer += 1;
 }
@@ -280,6 +283,16 @@ void Player::updateFrame() {
 	_forceRefresh = true;
 }
 
+void Player::activateTrigger() {
+	// TODO: Finish this!
+	// TODO: Also sync _walkTrigger, if necessary
+
+	if (_walkTrigger) {
+		_vm->_game->_trigger = _walkTrigger;
+		_walkTrigger = 0;
+	}
+}
+
 void Player::update() {
 	Scene &scene = _vm->_game->_scene;
 
@@ -443,10 +456,12 @@ void Player::move() {
 	if (newFacing && _moving)
 		startMovement();
 
-	if (_turnToFacing != _facing)
+	if (_turnToFacing != _facing) {
 		changeFacing();
-	else if (!_moving)
+	} else if (!_moving) {
 		updateFrame();
+		activateTrigger();
+	}
 
 	int velocity = _velocity;
 	if (_scalingVelocity && (_totalDistance > 0)) {
@@ -811,6 +826,7 @@ void Player::firstWalk(Common::Point fromPos, Facing fromFacing, Common::Point d
 }
 
 void Player::setWalkTrigger(int val) {
+	_walkTrigger = val;
 	warning("TODO: Player::setWalkTrigger");
 }
 
diff --git a/engines/mads/player.h b/engines/mads/player.h
index 96d5aa8..5500004 100644
--- a/engines/mads/player.h
+++ b/engines/mads/player.h
@@ -95,6 +95,8 @@ private:
 	void startMovement();
 
 	void changeFacing();
+
+	void activateTrigger();
 public:
 	MADSAction *_action;
 
@@ -141,6 +143,7 @@ public:
 	int _currentDepth;
 	int _currentScale;
 	Common::String _spritesPrefix;
+	int _walkTrigger;
 public:
 	Player(MADSEngine *vm);
 


Commit: 9aeecf83a3fb4a943974149cde5d075a4b1d3ce5
    https://github.com/scummvm/scummvm/commit/9aeecf83a3fb4a943974149cde5d075a4b1d3ce5
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-24T23:21:08+02:00

Commit Message:
MADS: Implement getFrameWidth and getFrameHeight

Changed paths:
    engines/mads/assets.h



diff --git a/engines/mads/assets.h b/engines/mads/assets.h
index 8a0dc2c..aa7e188 100644
--- a/engines/mads/assets.h
+++ b/engines/mads/assets.h
@@ -99,8 +99,8 @@ public:
 	int getCount() { return _frameCount; }
 	int getFrameRate() const { return _frameRate; }
 	int getPixelSpeed() const { return _pixelSpeed; }
-	int getFrameWidth(int index);
-	int getFrameHeight(int index);
+	int getFrameWidth(int index) { assert (index < _frameCount); return _frames[index]._bounds.width(); }
+	int getFrameHeight(int index) { assert (index < _frameCount); return _frames[index]._bounds.height(); }
 	int getMaxFrameWidth() const { return _maxWidth; }
 	int getMaxFrameHeight() const { return _maxHeight; }
 	MSprite *getFrame(int frameIndex);


Commit: 8422142c743e7c7c7efc75713383325fd0f4ad8b
    https://github.com/scummvm/scummvm/commit/8422142c743e7c7c7efc75713383325fd0f4ad8b
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-25T00:26:05+02:00

Commit Message:
MADS: Phantom: Implement scene 202

Changed paths:
    engines/mads/game.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/game.h b/engines/mads/game.h
index c5dfcbb..bdc7fc9 100644
--- a/engines/mads/game.h
+++ b/engines/mads/game.h
@@ -240,8 +240,10 @@ public:
 
 	typedef struct {
 		//TODO
+		bool _panFrame;
 	} Camera;
 	Camera _camX, _camY;
+
 	void camPanTo(Camera *camera, int target);
 
 };
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index a9ae84e..222efb4 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -78,7 +78,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 201:	// entrance / ticket office
 		return new Scene201(vm);
 	case 202:	// outside offices / paintings room
-		return new DummyScene(vm);	// TODO
+		return new Scene202(vm);
 	case 203:	// office
 		return new DummyScene(vm);	// TODO
 	case 204:	// library
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index eac175c..aafcc9a 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -573,5 +573,925 @@ void Scene201::handleConversation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene202::Scene202(MADSEngine *vm) : Scene2xx(vm) {
+	_ticketGivenFl = false;
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_skipWalkFl = false;
+
+	for (int i = 0; i < 5; i++) {
+		_chandeliersPosX[i] = -1;
+		_chandeliersHotspotId[i] = -1;
+	}
+
+	_conversationCount = -1;
+	_usherStatus = -1;
+	_usherFrame = -1;
+	_usherCount = -1;
+	_degasStatus = -1;
+	_degasFrame = -1;
+}
+
+void Scene202::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_ticketGivenFl);
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_skipWalkFl);
+
+	for (int i = 0; i < 5; i++) {
+		s.syncAsSint16LE(_chandeliersPosX[i]);
+		s.syncAsSint16LE(_chandeliersHotspotId[i]);
+	}
+
+	s.syncAsSint16LE(_conversationCount);
+	s.syncAsSint16LE(_usherStatus);
+	s.syncAsSint16LE(_usherFrame);
+	s.syncAsSint16LE(_usherCount);
+	s.syncAsSint16LE(_degasStatus);
+	s.syncAsSint16LE(_degasFrame);
+}
+
+void Scene202::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if (_globals[kTicketPeoplePresent] == 2)
+		_scene->_initialVariant = 1;
+
+	_scene->addActiveVocab(NOUN_CHANDELIER);
+	_scene->addActiveVocab(NOUN_EDGAR_DEGAS);
+}
+
+void Scene202::enter() {
+	_vm->_disableFastwalk = true;
+	_ticketGivenFl = false;
+	_chandeliersPosX[0] = 77;
+	_chandeliersPosX[1] = 192;
+	_chandeliersPosX[2] = 319;
+	_chandeliersPosX[3] = 445;
+	_chandeliersPosX[4] = 560;
+
+	if (_globals[kTicketPeoplePresent] == 2)
+		_globals[kMakeRichLeave203] = true;
+
+	if ((_globals[kDegasNameIsKnown]) || (_globals[kCurrentYear] == 1993))
+		_scene->_hotspots.activate(NOUN_GENTLEMAN, false);
+
+	for (int i = 0; i < 5; i++) {
+		_globals._sequenceIndexes[2 + i] = -1;
+		_chandeliersHotspotId[i] = -1;
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_skipWalkFl = false;
+	}
+
+	_conversationCount = 0;
+	_vm->_gameConv->get(17);
+	_vm->_gameConv->get(9);
+
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+
+	if (_globals[kTicketPeoplePresent] == 2) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 0), 0);
+		_anim0ActvFl = true;
+		_usherStatus = 2;
+	} else
+		_scene->_hotspots.activate(NOUN_USHER, false);
+
+	if (_globals[kDegasNameIsKnown])
+		_anim1ActvFl = false;
+
+	if ((_globals[kCurrentYear] == 1881) && (!_globals[kDegasNameIsKnown])) {
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('d', 1), 100);
+		_anim1ActvFl = true;
+		_degasStatus = 4;
+	}
+
+	if (_vm->_gameConv->_restoreRunning == 17) {
+		_vm->_gameConv->run(17);
+		_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+		_vm->_gameConv->exportValue(0);
+		_game._player._playerPos = Common::Point(569, 147);
+		_game._player._facing = FACING_NORTHEAST;
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+
+	if (_vm->_gameConv->_restoreRunning == 9) {
+		_vm->_gameConv->run(9);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_game._player._playerPos = Common::Point(400, 141);
+		_game._player._facing = FACING_NORTHWEST;
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+
+	if (_scene->_priorSceneId == 201) {
+		_game._player._playerPos = Common::Point(3, 141);
+		_game._player.walk(Common::Point(40, 141), FACING_EAST);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	} else if (_scene->_priorSceneId == 203) {
+		_game._player._playerPos = Common::Point(134, 112);
+		_game._player._facing = FACING_SOUTH;
+		_game._player._stepEnabled = false;
+		_game._player.walk(Common::Point(126, 123), FACING_SOUTH);
+		_game._player.setWalkTrigger(60);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	} else if (_scene->_priorSceneId == 204) {
+		_game._player._playerPos = Common::Point(253, 117);
+		_game._player.walk(Common::Point(255, 133), FACING_SOUTH);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_scene->setCamera(Common::Point(70, 0));
+	} else if (_scene->_priorSceneId == 205) {
+		_game._player._playerPos = Common::Point(510, 117);
+		_game._player.walk(Common::Point(512, 133), FACING_SOUTH);
+		_scene->setCamera(Common::Point(320, 0));
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	} else if ((_scene->_priorSceneId == 101) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(636, 143);
+		_game._player.walk(Common::Point(598, 143), FACING_WEST);
+		_scene->setCamera(Common::Point(320, 0));
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	} else if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	}
+
+	handleChandeliersPositions();
+	sceneEntrySound();
+}
+
+void Scene202::step() {
+	if (_game._camX._panFrame)
+		handleChandeliersPositions();
+
+	if (_anim0ActvFl)
+		handleUsherAnimation();
+
+	if (_game._trigger == 100)
+		_anim1ActvFl = false;
+
+	if (_anim1ActvFl)
+		handleDegasAnimation();
+
+	if ((_globals[kCurrentYear] == 1881) && !_globals[kDegasNameIsKnown] && (_game._player._playerPos.x < 405) && !_skipWalkFl) {
+		_game._player.walk(Common::Point(400, 141), FACING_NORTHWEST);
+		_game._player.setWalkTrigger(90);
+		_game._player._stepEnabled = false;
+		_skipWalkFl = true;
+	}
+
+	if (_game._trigger == 90) {
+		_game._player._stepEnabled = true;
+		_vm->_gameConv->run(9);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+
+	switch (_game._trigger) {
+	case 60:
+		_scene->deleteSequence(_globals._sequenceIndexes[0]);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
+		break;
+
+	case 61:
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+
+	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
+		++_conversationCount;
+		if (_conversationCount > 200)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+}
+
+void Scene202::actions() {
+	if (_vm->_gameConv->_running == 17) {
+		handleConversation1();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 9) {
+		handleConversation2();
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_globals[kTicketPeoplePresent] == 2) && (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_ARCHWAY) || _action.isAction(VERB_TALK_TO, NOUN_USHER))) {
+		_vm->_gameConv->run(17);
+		_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+		_vm->_gameConv->exportValue(0);
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_GIVE, NOUN_TICKET, NOUN_USHER)) {
+		_ticketGivenFl = true;
+		_vm->_gameConv->run(17);
+		_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+		_vm->_gameConv->exportValue(1);
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_TALK_TO, NOUN_GENTLEMAN)) || (_action.isAction(VERB_TALK_TO, NOUN_EDGAR_DEGAS))) {
+		if (!_globals[kDegasNameIsKnown] ) {
+			_vm->_gameConv->run(9);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		} else
+			_vm->_dialogs->show(20224);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 4, 80);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 82);
+			break;
+
+		case 80:
+			_scene->deleteSequence(_globals._sequenceIndexes[0]);
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 81);
+			_vm->_sound->command(24);
+			break;
+
+		case 81: {
+			int idx = _globals._sequenceIndexes[0];
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
+			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			_game._player.walk(Common::Point(134, 112), FACING_NORTH);
+			_game._player.setWalkTrigger(83);
+			}
+			break;
+
+		case 82:
+			_game._player._visible = true;
+			break;
+
+		case 83:
+			_scene->deleteSequence(_globals._sequenceIndexes[0]);
+			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 84);
+			_vm->_sound->command(25);
+			break;
+
+		case 84:
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
+			_scene->_nextSceneId = 203;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_ARCHWAY)) {
+		_scene->_nextSceneId = 201;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_ARCHWAY)) {
+		_scene->_nextSceneId = 101;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_MIDDLE_DOOR)) {
+		_scene->_nextSceneId = 204;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR)) {
+		_scene->_nextSceneId = 205;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(20210);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(20211);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(20212);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LEFT_ARCHWAY)) {
+			_vm->_dialogs->show(20213);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RIGHT_ARCHWAY)) {
+			_vm->_dialogs->show(20214);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LEFT_DOOR)) {
+			_vm->_dialogs->show(20215);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MIDDLE_DOOR)) {
+			_vm->_dialogs->show(20216);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RIGHT_DOOR)) {
+			_vm->_dialogs->show(20217);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LIGHT_FIXTURE)) {
+			_vm->_dialogs->show(20218);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_OVERDOOR_MEDALLION)) {
+			_vm->_dialogs->show(20219);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DECORATIVE_MOLDING)) {
+			_vm->_dialogs->show(20220);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PAINTING)) {
+			_vm->_dialogs->show(20221);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EDGAR_DEGAS) || _action.isObject(NOUN_GENTLEMAN)) {
+			_vm->_dialogs->show(20223);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_USHER)) {
+			_vm->_dialogs->show(20225);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHANDELIER)) {
+			_vm->_dialogs->show(20218);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE) && (_action.isObject(NOUN_GENTLEMAN) || _action.isObject(NOUN_EDGAR_DEGAS))) {
+		_vm->_dialogs->show(20226);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_USHER)) {
+		_vm->_dialogs->show(20227);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) {
+		_vm->_dialogs->show(20222);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene202::preActions() {
+	if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR))
+		_game._player.walk(Common::Point(126, 123), FACING_NORTHEAST);
+
+	if ((_globals[kTicketPeoplePresent] == 2) && (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_ARCHWAY)))
+		_game._player.walk(Common::Point(569, 147), FACING_NORTHEAST);
+
+	if (_action.isAction(VERB_TAKE, NOUN_GENTLEMAN) || _action.isAction(VERB_TAKE, NOUN_EDGAR_DEGAS))
+		_game._player._needToWalk = false;
+}
+
+void Scene202::handleConversation1() {
+	int interlocutorFl = false;
+	int heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 0:
+		if (!_ticketGivenFl)
+			_usherStatus = 4;
+
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 3:
+		_vm->_gameConv->setInterlocutorTrigger(72);
+		_vm->_gameConv->setHeroTrigger(76);
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 4:
+		_vm->_gameConv->setHeroTrigger(76);
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 70:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_usherStatus = 0;
+		break;
+
+	case 72:
+		_usherStatus = 17;
+		break;
+
+	case 74:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+		_usherStatus = 2;
+		_conversationCount = 0;
+		break;
+
+	case 76:
+		_globals[kWalkerConverse] = 0;
+		_ticketGivenFl = false;
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(74);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(70);
+
+	_usherCount = 0;
+}
+
+void Scene202::handleConversation2() {
+	int interlocutorFl = false;
+	int heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 1:
+		_globals[kDegasNameIsKnown] = 1;
+		break;
+
+	case 10:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_vm->_gameConv->setHeroTrigger(96);
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 74:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+		_degasStatus = 4;
+		_conversationCount = 0;
+		break;
+
+	case 93:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		switch (_action._activeAction._verbId) {
+		case 1:
+			_degasStatus = 1;
+			break;
+
+		case 2:
+			_degasStatus = 2;
+			break;
+
+		default:
+			if ((_action._activeAction._verbId != 11) && (_action._activeAction._verbId != 12))
+				_degasStatus = 0;
+			break;
+		}
+		break;
+
+	case 96:
+		_vm->_gameConv->setInterlocutorTrigger(97);
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 97:
+		_vm->_gameConv->setHeroTrigger(98);
+		_degasStatus = 0;
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 98:
+		_globals[kWalkerConverse] = 0;
+		_degasStatus = 3;
+
+		if (_globals[kDegasNameIsKnown] == 1) {
+			int idx = _scene->_dynamicHotspots.add(NOUN_EDGAR_DEGAS, VERB_WALK_TO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(idx, Common::Point(596, 144), FACING_EAST);
+			_scene->setDynamicAnim(idx, _globals._animationIndexes[1], 1);
+		} else {
+			int idx = _scene->_dynamicHotspots.add(NOUN_GENTLEMAN, VERB_WALK_TO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(idx, Common::Point(596, 144), FACING_EAST);
+			_scene->setDynamicAnim(idx, _globals._animationIndexes[1], 1);
+		}
+
+		_globals[kDegasNameIsKnown] = 2;
+		interlocutorFl = true;
+		heroFl = true;
+		_scene->_hotspots.activate(NOUN_GENTLEMAN, false);
+		_game._player._stepEnabled = false;
+		_vm->_gameConv->hold();
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(74);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(93);
+}
+
+void Scene202::handleChandeliersPositions() {
+	int center = _scene->_posAdjust.x + 160;
+
+	for (int chandelier = 0; chandelier < 5; chandelier++) {
+		if (_globals._sequenceIndexes[chandelier + 2] >= 0)
+			_scene->deleteSequence(_globals._sequenceIndexes[chandelier + 2]);
+
+		int diff = center - _chandeliersPosX[chandelier];
+		int dir = 0;
+
+		if (diff < 0)
+			dir = 1;
+		else if (diff > 0)
+			dir = -1;
+
+		int shiftBase = (int)(abs(diff) / 5);
+		if (dir < 0)
+			shiftBase = -shiftBase;
+
+		int posX = _chandeliersPosX[chandelier] + shiftBase - 1;
+		int posY = _scene->_sprites[_globals._spriteIndexes[2]]->getFrameHeight(0) - 1;
+		int frameWidth = _scene->_sprites[_globals._spriteIndexes[2]]->getFrameWidth(0);
+
+		if (((posX - ((frameWidth >> 1) + 1)) >= (_scene->_posAdjust.x + 320)) || ((posX + ((frameWidth >> 1) + 1)) < _scene->_posAdjust.x))
+			_globals._sequenceIndexes[chandelier + 2] = -1;
+		else {
+			if (_chandeliersHotspotId[chandelier] != -1)
+				_scene->_dynamicHotspots.remove(_chandeliersHotspotId[chandelier]);
+
+			_chandeliersHotspotId[chandelier] = _scene->_dynamicHotspots.add(NOUN_CHANDELIER, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(posX - 8, posY - 12, posX + 8, posY + 1));
+
+			_globals._sequenceIndexes[chandelier + 2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[chandelier + 2], Common::Point(posX, posY));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[chandelier + 2], 1);
+		}
+	}
+}
+
+void Scene202::handleUsherAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _usherFrame)
+		return;
+
+	_usherFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random;
+	switch (_usherFrame) {
+	case 1:
+	case 13:
+	case 35:
+	case 51:
+	case 52:
+	case 53:
+	case 54:
+		switch (_usherStatus) {
+		case 0:
+			random = _vm->getRandomNumber(1, 3);
+			++_usherCount;
+			if (_usherCount > 15) {
+				if (_action._activeAction._verbId == 0) {
+					_usherStatus = 3;
+					random = 5;
+				} else {
+					_usherStatus = 2;
+					random = 7;
+				}
+			}
+			break;
+
+		case 3:
+			random = 5;
+			break;
+
+		case 4:
+			random = 6;
+			break;
+
+		case 17:
+			random = 4;
+			break;
+
+		default:
+			random = 7;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 51;
+			break;
+
+		case 2:
+			resetFrame = 52;
+			break;
+
+		case 3:
+			resetFrame = 53;
+			break;
+
+		case 4:
+			resetFrame = 21;
+			_usherStatus = 17;
+			break;
+
+		case 5:
+			resetFrame = 1;
+			break;
+
+		case 6:
+			resetFrame = 35;
+			_usherStatus = 0;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+
+	case 7:
+		if (_usherStatus == 3)
+			random = 1;
+		else
+			random = 2;
+
+		if (random == 1)
+			resetFrame = 6;
+		else
+			resetFrame = 7;
+
+		break;
+
+	case 28:
+		if (_usherStatus == 17) {
+			random = 1;
+			++_usherCount;
+			if (_usherCount > 15) {
+				_usherStatus = 2;
+				random = 2;
+			}
+		} else
+			random = 2;
+
+		if (random == 1)
+			resetFrame = 27;
+		else
+			resetFrame = 28;
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_usherFrame = resetFrame;
+	}
+}
+
+
+void Scene202::handleDegasAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _degasFrame)
+		return;
+
+	_degasFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random;
+
+	switch (_degasFrame) {
+	case 1:
+	case 17:
+	case 58:
+		switch (_degasStatus) {
+		case 0:
+			_degasStatus = 4;
+			random = 1;
+			break;
+
+		case 1:
+		case 2:
+		case 3:
+			random = 2;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(3, 50);
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 1;
+			break;
+
+		case 2:
+			resetFrame = 58;
+			break;
+
+		case 3:
+			resetFrame = 58;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+
+	case 33:
+	case 40:
+	case 55:
+	case 62:
+		switch (_degasStatus) {
+		case 0:
+			_degasStatus = 4;
+			random = 1;
+			break;
+
+		case 1:
+			_degasStatus = 4;
+			random = 2;
+			break;
+
+		case 2:
+			_degasStatus = 4;
+			random = 3;
+			break;
+
+		case 3:
+			random = 4;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(5, 50);
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 33;
+			break;
+
+		case 2:
+			resetFrame = 17;
+			break;
+
+		case 3:
+			resetFrame = 42;
+			break;
+
+		case 4:
+			resetFrame = 62;
+			break;
+
+		case 5:
+			resetFrame = 41;
+			break;
+
+		case 6:
+			resetFrame = 55;
+			break;
+
+		default:
+			resetFrame = 39;
+			break;
+		}
+		break;
+
+	case 42:
+		switch (_degasStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			random = 1;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 50);
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 39;
+		else
+			resetFrame = 41;
+
+		break;
+
+	case 110:
+		_vm->_gameConv->release();
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_degasFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index e30224e..cff6640 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -78,6 +78,38 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene202 : public Scene2xx {
+private:
+	bool _ticketGivenFl;
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _skipWalkFl;
+	int _chandeliersPosX[5];
+	int _chandeliersHotspotId[5];
+	int _conversationCount;
+	int _usherStatus;
+	int _usherFrame;
+	int _usherCount;
+	int _degasStatus;
+	int _degasFrame;
+
+	void handleConversation1();
+	void handleConversation2();
+	void handleUsherAnimation();
+	void handleDegasAnimation();
+	void handleChandeliersPositions();
+
+public:
+	Scene202(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: f7389e98bcedb0ab0c8b0cc3f6a38db90857d967
    https://github.com/scummvm/scummvm/commit/f7389e98bcedb0ab0c8b0cc3f6a38db90857d967
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-25T00:28:40+02:00

Commit Message:
MADS: Dragon: Some rework in scene 104

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 61e64b5..9ef8768 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -1502,7 +1502,8 @@ void Scene104::step() {
 void Scene104::actions() {
 	if (_vm->_gameConv->_running == 1) {
 		handleFinalConversation();
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action._lookFlag) {
@@ -1511,7 +1512,8 @@ void Scene104::actions() {
 		else
 			_vm->_dialogs->show(10437);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) {
@@ -1520,7 +1522,8 @@ void Scene104::actions() {
 		else
 			_vm->_dialogs->show(10434);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) {
@@ -1589,7 +1592,8 @@ void Scene104::actions() {
 		} else
 			_vm->_dialogs->show(10434);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE) || _action.isAction(VERB_OPEN)) && _action.isObject(NOUN_BOOKS)) {
@@ -1651,7 +1655,8 @@ void Scene104::actions() {
 			default:
 				break;
 			}
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 	}
 
@@ -1700,7 +1705,8 @@ void Scene104::actions() {
 			default:
 				break;
 			}
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 	}
 
@@ -1757,7 +1763,8 @@ void Scene104::actions() {
 		} else
 			_vm->_dialogs->show(10445);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) {
@@ -1793,12 +1800,14 @@ void Scene104::actions() {
 					default:
 						break;
 					}
-					goto handled;
+					_action._inProgress = false;
+					return;
 				}
 			}
 		} else {
 			_vm->_dialogs->show(10445);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 	}
 
@@ -1810,27 +1819,32 @@ void Scene104::actions() {
 					_scene->_hotspots.activate(NOUN_BOOKS, true);
 					_globals[kBooksStatus] = 1;
 					_vm->_dialogs->show(10418);
-					goto handled;
+					_action._inProgress = false;
+					return;
 
 				case 1:
 					_vm->_dialogs->show(10418);
-					goto handled;
+					_action._inProgress = false;
+					return;
 
 				case 2:
 				case 4:
 					_vm->_dialogs->show(10419);
-					goto handled;
+					_action._inProgress = false;
+					return;
 
 				case 3:
 					_vm->_dialogs->show(10420);
-					goto handled;
+					_action._inProgress = false;
+					return;
 
 				default:
 					break;
 				}
 			} else {
 				_vm->_dialogs->show(10439);
-				goto handled;
+				_action._inProgress = false;
+				return;
 			}
 		}
 
@@ -1840,7 +1854,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10438);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_TAPESTRY)) {
@@ -1856,7 +1871,8 @@ void Scene104::actions() {
 			} else
 				_vm->_dialogs->show(10439);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_RUG)) {
@@ -1865,7 +1881,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10439);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_FIREPLACE_SCREEN)) {
@@ -1874,7 +1891,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10439);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) {
@@ -1883,7 +1901,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10434);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_SCONCE)) {
@@ -1892,7 +1911,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10440);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_WOOD_BASKET)) {
@@ -1901,7 +1921,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10439);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_TROPHY)) {
@@ -1910,7 +1931,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10441);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_READING_BENCH)) {
@@ -1919,7 +1941,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10439);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_LOVESEAT)) {
@@ -1928,7 +1951,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10439);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) {
@@ -1937,17 +1961,20 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10434);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_SECRET_DOOR)) {
 			_vm->_dialogs->show(10430);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if ((_action.isObject(NOUN_DOORWAY) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_OPEN, NOUN_DOORWAY)) && (_globals[kPlayerPersona] == 1)) {
 			_vm->_dialogs->show(10432);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isAction(VERB_LOOK, NOUN_WALL_PANEL)) {
@@ -1956,22 +1983,26 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10436);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_KING) && _globals[kPlayerPersona] == 1) {
 			_vm->_dialogs->show(10443);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) {
 			_vm->_dialogs->showItem(OBJ_MAGIC_MUSIC_BOX, 843, 0);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_MACMORN) && (_globals[kPlayerPersona] == 1)) {
 			_vm->_dialogs->show(10444);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_TABLE)) {
@@ -1982,7 +2013,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10448);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_DECORATION)) {
@@ -1991,7 +2023,8 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10449);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_SWORD)) {
@@ -2000,17 +2033,20 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10450);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_FLOOR) && (_globals[kPlayerPersona] == 1)) {
 			_vm->_dialogs->show(10439);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_WALL) && (_globals[kPlayerPersona] == 1)) {
 			_vm->_dialogs->show(10439);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CANDLESTICK)) {
@@ -2019,17 +2055,20 @@ void Scene104::actions() {
 			else
 				_vm->_dialogs->show(10461);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_QUEEN_MOTHER)) {
 			_vm->_dialogs->show(10456);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_MACMORN)) {
 			_vm->_dialogs->show(10444);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 	}
 
@@ -2039,7 +2078,8 @@ void Scene104::actions() {
 		else
 			_vm->_dialogs->show(10445);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) {
@@ -2048,7 +2088,8 @@ void Scene104::actions() {
 		else
 			_vm->_dialogs->show(10445);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TROPHY)) {
@@ -2057,7 +2098,8 @@ void Scene104::actions() {
 		else
 			_vm->_dialogs->show(10445);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_OPEN, NOUN_READING_BENCH)) {
@@ -2066,7 +2108,8 @@ void Scene104::actions() {
 		else
 			_vm->_dialogs->show(10445);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_LOVESEAT)) {
@@ -2075,22 +2118,26 @@ void Scene104::actions() {
 		else
 			_vm->_dialogs->show(10445);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if ((_action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && (_action.isObject(NOUN_SECRET_DOOR) || _action.isObject(NOUN_WALL_PANEL))) {
 		_vm->_dialogs->show(10431);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_INVOKE, NOUN_SIGNET_RING) && (_globals[kPlayerPersona] == 1)) {
 		_vm->_dialogs->show(10433);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_PUT, NOUN_TENTACLE_PARTS, NOUN_WALL_PANEL) && (_globals[kPlayerPersona] == 0)) {
 		_vm->_dialogs->show(10446);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_SHIFT_INTO_BEAR) && _anim0ActvFl) {
@@ -2110,7 +2157,8 @@ void Scene104::actions() {
 			else
 				_vm->_gameConv->exportValue(0);
 		}
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if ((_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_TAKE, NOUN_SWORD)) && _anim0ActvFl) {
@@ -2134,7 +2182,8 @@ void Scene104::actions() {
 			_game._player._stepEnabled = false;
 		}
 		_amuletWorksFl = true;
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_INVOKE, NOUN_AMULET) && _anim0ActvFl) {
@@ -2158,57 +2207,58 @@ void Scene104::actions() {
 		} else
 			_vm->_dialogs->showItem(OBJ_AMULET, 945, 0);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_QUEEN_MOTHER)) {
 		_vm->_dialogs->show(10458);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_TALK_TO, NOUN_MACMORN)) {
 		_vm->_dialogs->show(10464);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_TALK_TO, NOUN_QUEEN_MOTHER)) {
 		_vm->_dialogs->show(10463);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_TALK_TO, NOUN_KING)) {
 		_vm->_dialogs->show(10465);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_POUR_CONTENTS_OF, NOUN_MACMORN)) {
 		_vm->_dialogs->show(10462);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 
 	if (_anim2ActvFl && (_action.isAction(VERB_WALK_ACROSS) || _action.isAction(VERB_WALK_TO))) {
 		_vm->_dialogs->show(10445);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_TAKE, NOUN_CANDLESTICK)) {
 		_vm->_dialogs->show(10468);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_OPEN, NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) {
 		_vm->_dialogs->show(10470);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
-
-	goto done;
-
-handled:
-	_action._inProgress = false;
-
-done:
-	;
 }
 
 void Scene104::preActions() {


Commit: 2c5b63acfae29b21e31c4781f35f85c33ac72c86
    https://github.com/scummvm/scummvm/commit/2c5b63acfae29b21e31c4781f35f85c33ac72c86
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-25T19:02:11+01:00

Commit Message:
MADS: Phantom: Implement scene 203

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h
    engines/mads/scene.cpp
    engines/mads/scene.h
    engines/mads/sound.cpp
    engines/mads/sound.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 222efb4..04f22af 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -80,7 +80,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 202:	// outside offices / paintings room
 		return new Scene202(vm);
 	case 203:	// office
-		return new DummyScene(vm);	// TODO
+		return new Scene203(vm);
 	case 204:	// library
 		return new DummyScene(vm);	// TODO
 	case 205:	// upper floor, outside balcony boxes
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index aafcc9a..1dbe760 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -510,8 +510,8 @@ void Scene201::handleSellerAnimation() {
 }
 
 void Scene201::handleConversation() {
-	int interlocutorFl = false;
-	int heroFl = false;
+	bool interlocutorFl = false;
+	bool heroFl = false;
 
 	switch (_action._activeAction._verbId) {
 	case 4:
@@ -1033,8 +1033,8 @@ void Scene202::preActions() {
 }
 
 void Scene202::handleConversation1() {
-	int interlocutorFl = false;
-	int heroFl = false;
+	bool interlocutorFl = false;
+	bool heroFl = false;
 
 	switch (_action._activeAction._verbId) {
 	case 0:
@@ -1100,8 +1100,8 @@ void Scene202::handleConversation1() {
 }
 
 void Scene202::handleConversation2() {
-	int interlocutorFl = false;
-	int heroFl = false;
+	bool interlocutorFl = false;
+	bool heroFl = false;
 
 	switch (_action._activeAction._verbId) {
 	case 1:
@@ -1493,5 +1493,1764 @@ void Scene202::handleDegasAnimation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene203::Scene203(MADSEngine *vm) : Scene2xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+	_showNoteFl = false;
+
+	_brieStatus = -1;
+	_brieFrame = -1;
+	_brieCount = -1;
+	_raoulStatus = -1;
+	_raoulFrame = -1;
+	_raoulCount = -1;
+	_richardStatus = -1;
+	_richardFrame = -1;
+	_daaeStatus = -1;
+	_daaeFrame = -1;
+	_conversationCount = -1;
+}
+
+void Scene203::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_anim3ActvFl);
+	s.syncAsByte(_showNoteFl);
+
+	s.syncAsSint16LE(_brieStatus);
+	s.syncAsSint16LE(_brieFrame);
+	s.syncAsSint16LE(_brieCount);
+	s.syncAsSint16LE(_raoulStatus);
+	s.syncAsSint16LE(_raoulFrame);
+	s.syncAsSint16LE(_raoulCount);
+	s.syncAsSint16LE(_richardStatus);
+	s.syncAsSint16LE(_richardFrame);
+	s.syncAsSint16LE(_daaeStatus);
+	s.syncAsSint16LE(_daaeFrame);
+	s.syncAsSint16LE(_conversationCount);
+}
+
+void Scene203::setup() {
+	if (_globals[kCurrentYear] == 1993)
+		_scene->_initialVariant = 1;
+
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene203::enter() {
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+		_anim3ActvFl = false;
+		_showNoteFl = false;
+	}
+
+	_conversationCount = 0;
+	_scene->_hotspots.activate(NOUN_LETTER, false);
+	_scene->_hotspots.activate(NOUN_PARCHMENT, false);
+	_scene->_hotspots.activate(NOUN_NOTICE, false);
+
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 1), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_6", false);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_vm->_gameConv->get(5);
+	} else {
+		_vm->_gameConv->get(8);
+		_vm->_gameConv->get(15);
+	}
+
+	if (_globals[kCurrentYear] == 1993) {
+		if (_game._objects.isInRoom(OBJ_PARCHMENT)) {
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 3);
+			_scene->_hotspots.activate(NOUN_PARCHMENT, true);
+		}
+
+		_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false);
+		_scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, false);
+
+		if (!_globals[kMakeBrieLeave203]) {
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1);
+			_anim0ActvFl = true;
+			_brieStatus = 4;
+		} else {
+			_scene->_hotspots.activate(NOUN_MONSIEUR_BRIE, false);
+			_scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, true);
+		}
+
+		if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && (_vm->_gameConv->_restoreRunning == 5)) {
+			_brieStatus = 4;
+			_raoulStatus = 0;
+			_anim1ActvFl = true;
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0);
+			_scene->setAnimFrame(_globals._animationIndexes[1], 9);
+			_vm->_gameConv->run(5);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_SMALL_NOTE));
+			_vm->_gameConv->exportValue(_globals[kReadBook]);
+			_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_LARGE_NOTE));
+			_vm->_gameConv->exportValue(_globals[kLookedAtCase]);
+			_vm->_gameConv->exportValue(_globals[kCharlesNameIsKnown]);
+			_vm->_gameConv->exportValue(_globals[kCanFindBookInLibrary]);
+			_vm->_gameConv->exportValue(_globals[kFlorentNameIsKnown]);
+			_vm->_gameConv->exportValue(_globals[kSandbagStatus]);
+			_vm->_gameConv->exportValue(_globals[kObservedPhan104]);
+		}
+
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_CANDLE, false);
+	} else if (_globals[kJacquesStatus] == 0) {
+		_scene->_hotspots.activate(NOUN_DESK_LAMP, false);
+		_scene->_hotspots.activate(NOUN_MONSIEUR_BRIE, false);
+		_scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, false);
+
+		if (!_globals[kMakeRichLeave203]) {
+			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 1);
+			_anim2ActvFl = true;
+			_richardStatus = 4;
+		} else {
+			_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false);
+			_scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, true);
+		}
+
+		if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && (_vm->_gameConv->_restoreRunning == 8)) {
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0);
+			_scene->setAnimFrame(_globals._animationIndexes[1], 9);
+			_anim1ActvFl = true;
+			_game._player._visible = false;
+			_raoulStatus = 0;
+			_vm->_gameConv->run(8);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		}
+
+		if (_game._objects.isInRoom(OBJ_LETTER)) {
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+			_scene->_hotspots.activate(NOUN_LETTER, true);
+		}
+
+		if (_game._objects.isInRoom(OBJ_NOTICE)) {
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 3);
+			_scene->_hotspots.activate(NOUN_NOTICE, true);
+		}
+	} else {
+		_scene->_hotspots.activate(NOUN_MONSIEUR_BRIE, false);
+		_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false);
+		_scene->_hotspots.activate(NOUN_DESK_LAMP, false);
+	}
+
+	if (_vm->_gameConv->_restoreRunning == 15) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+		_game._player._playerPos = Common::Point(98, 137);
+		_game._player._facing = FACING_NORTHEAST;
+		_vm->_gameConv->run(15);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]);
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+	} else if (_scene->_priorSceneId == 202) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+		_game._player._playerPos = Common::Point(195, 147);
+		_game._player._facing = FACING_NORTH;
+	} else if (_scene->_priorSceneId == 150) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+		_game._player._playerPos = Common::Point(98, 137);
+		_game._player._facing = FACING_NORTHEAST;
+		_vm->_gameConv->run(15);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]);
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	} else if ((_scene->_priorSceneId == 204) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+		_game._player._playerPos = Common::Point(319, 123);
+		_game._player._facing = FACING_SOUTHWEST;
+		_game._player.walk(Common::Point(276, 123), FACING_WEST);
+		_game._player.setWalkTrigger(95);
+		_game._player._stepEnabled = false;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene203::step() {
+	if (_anim0ActvFl)
+		handleBrieAnimation();
+
+	if (_anim1ActvFl)
+		handleRaoulAnimation();
+
+	if (_anim2ActvFl)
+		handleRichardAnimation();
+
+	if (_anim3ActvFl)
+		handleDaaeAnimation();
+
+	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
+		++_conversationCount;
+		if (_conversationCount > 200)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+
+	switch (_game._trigger) {
+	case 95:
+		_scene->deleteSequence(_globals._sequenceIndexes[5]);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 10);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 96);
+		break;
+
+	case 96:
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+		if (_vm->_gameConv->_running != 15)
+			_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene203::actions() {
+	if (_vm->_gameConv->_running == 5) {
+		handleBrieConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 8) {
+		handleRichardConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 15) {
+		handleRichardAndDaaeConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || _game._trigger) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 90);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 92);
+			break;
+
+		case 90:
+			_vm->_sound->command(24);
+			_scene->deleteSequence(_globals._sequenceIndexes[5]);
+			_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 91);
+			break;
+
+		case 91:
+			_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+			break;
+
+		case 92:
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[4]);
+			_game._player.walk(Common::Point(319, 123), FACING_WEST);
+			_game._player.setWalkTrigger(93);
+			break;
+
+		case 93:
+			_scene->_nextSceneId = 204;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE)) {
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0);
+		_anim1ActvFl = true;
+		_game._player._visible = false;
+		_raoulStatus = 0;
+		_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+
+		_vm->_gameConv->run(5);
+		_vm->_gameConv->hold();
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_SMALL_NOTE));
+		_vm->_gameConv->exportValue(_globals[kReadBook]);
+		_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_LARGE_NOTE));
+		_vm->_gameConv->exportValue(_globals[kLookedAtCase]);
+		if (_globals[kCharlesNameIsKnown] == 2)
+			_vm->_gameConv->exportValue(1);
+		else
+			_vm->_gameConv->exportValue(0);
+
+		_vm->_gameConv->exportValue(_globals[kCanFindBookInLibrary]);
+		_vm->_gameConv->exportValue(_globals[kFlorentNameIsKnown]);
+		_vm->_gameConv->exportValue(_globals[kSandbagStatus]);
+		_vm->_gameConv->exportValue(_globals[kObservedPhan104]);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_RICHARD)) {
+		if (_globals[kCameFromFade]) {
+			_vm->_gameConv->run(15);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]);
+		} else {
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0);
+			_anim1ActvFl = true;
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+			_raoulStatus = 0;
+			_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+
+			_vm->_gameConv->run(8);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_vm->_gameConv->hold();
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_GRAND_FOYER)) {
+		_scene->_nextSceneId = 202;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		if (_globals[kMakeBrieLeave203])
+			_vm->_dialogs->show(20337);
+		else
+			_vm->_dialogs->show(20310);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(20311);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(20312);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOOKCASE)) {
+			_vm->_dialogs->show(20313);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOORWAY)) {
+			_vm->_dialogs->show(20314);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_COMFY_CHAIR)) {
+			_vm->_dialogs->show(20315);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DESK)) {
+			_vm->_dialogs->show(20316);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MANAGERS_CHAIR)) {
+			_vm->_dialogs->show(20317);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DESK_LAMP)) {
+			_vm->_dialogs->show(20318);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LAMP)) {
+			_vm->_dialogs->show(20319);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LIGHT_FIXTURE)) {
+			_vm->_dialogs->show(20320);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WINDOW)) {
+			_vm->_dialogs->show(20321);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SHEERS)) {
+			_vm->_dialogs->show(20322);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TAPESTRY)) {
+			_vm->_dialogs->show(20323);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GRAND_FOYER)) {
+			_vm->_dialogs->show(20324);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TABLE)) {
+			_vm->_dialogs->show(20325);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CANDLE)) {
+			_vm->_dialogs->show(20326);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MONSIEUR_BRIE)) {
+			_vm->_dialogs->show(20327);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MONSIEUR_RICHARD)) {
+			_vm->_dialogs->show(20328);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PARCHMENT) && _game._objects.isInRoom(OBJ_PARCHMENT)) {
+			_vm->_dialogs->show(20329);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LETTER) && _game._objects.isInRoom(OBJ_LETTER)) {
+			_vm->_dialogs->show(20331);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_NOTICE) && _game._objects.isInRoom(OBJ_NOTICE)) {
+			_vm->_dialogs->show(20333);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_PARCHMENT)) {
+		_vm->_dialogs->show(20330);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_LETTER)) {
+		_vm->_dialogs->show(20332);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_NOTICE)) {
+		_vm->_dialogs->show(20334);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE)) {
+		_vm->_dialogs->show(20335);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_RICHARD)) {
+		_vm->_dialogs->show(20336);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene203::preActions() {
+	if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_RICHARD)) {
+		if (_globals[kCameFromFade])
+			_game._player.walk(Common::Point(98, 137), FACING_NORTHEAST);
+		else
+			_game._player.walk(Common::Point(154, 131), FACING_NORTHWEST);
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE))
+		_game._player.walk(Common::Point(154, 131), FACING_NORTHWEST);
+
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+		_game._player.walk(Common::Point(276, 123), FACING_EAST);
+}
+
+void Scene203::handleBrieConversation() {
+	bool interlocutorFl = false;
+	bool heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 9:
+	case 12:
+	case 35:
+	case 42:
+		_vm->_gameConv->setInterlocutorTrigger(70);
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 14:
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_raoulStatus = 5;
+		}
+		break;
+
+	case 17:
+		_raoulStatus = 0;
+		_vm->_gameConv->hold();
+		break;
+
+	case 24:
+		_vm->_gameConv->setInterlocutorTrigger(78);
+		interlocutorFl = true;
+		break;
+
+	case 20:
+	case 25:
+		_vm->_gameConv->setInterlocutorTrigger(76);
+		interlocutorFl = true;
+		break;
+
+	case 37:
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			if (_vm->_sound->_preferRoland)
+				_vm->_sound->command(65);
+			else
+				_scene->playSpeech(1);
+
+			_scene->_sequences.setTimingTrigger(60, 110);
+		}
+		break;
+
+	case 41:
+		_globals[kDoneBrieConv203] = 1;
+		_globals[kChrisFStatus] = 0;
+		break;
+
+	case 44:
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_raoulStatus = 3;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 60:
+		_brieStatus = 0;
+		break;
+
+	case 65:
+		_brieStatus = 4;
+		break;
+
+	case 70:
+		_vm->_gameConv->setHeroTrigger(71);
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 71:
+		_raoulStatus = 2;
+		break;
+
+	case 74:
+		_vm->_gameConv->hold();
+		_raoulStatus = 3;
+		break;
+
+	case 76:
+		_brieStatus = 1;
+		break;
+
+	case 78:
+		_brieStatus = 2;
+		break;
+
+	case 110:
+		_vm->_gameConv->release();
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl && (_raoulStatus != 5))
+		_vm->_gameConv->setHeroTrigger(65);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(60);
+
+	_brieCount = 0;
+	_raoulCount = 0;
+}
+
+
+
+void Scene203::handleRichardConversation() {
+	bool interlocutorFl = false;
+	bool heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 4:
+		_vm->_gameConv->setInterlocutorTrigger(83);
+		interlocutorFl = true;
+		break;
+
+	case 5:
+	case 15:
+	case 20:
+	case 21:
+	case 27:
+		_vm->_gameConv->setInterlocutorTrigger(70);
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 7:
+		if (_game._objects.isInRoom(OBJ_NOTICE) && !_game._trigger) {
+			_vm->_gameConv->hold();
+			_raoulStatus = 3;
+		}
+		break;
+
+	case 9:
+		if (_game._objects.isInRoom(OBJ_LETTER) && !_game._trigger) {
+			_vm->_gameConv->hold();
+			_raoulStatus = 4;
+		}
+		break;
+
+	case 17:
+		_vm->_gameConv->setInterlocutorTrigger(85);
+		interlocutorFl = true;
+		break;
+
+	case 19:
+		_vm->_gameConv->setInterlocutorTrigger(81);
+		interlocutorFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 65:
+		_richardStatus = 4;
+		break;
+
+	case 70:
+		_vm->_gameConv->setHeroTrigger(71);
+		interlocutorFl = true;
+		heroFl = true;
+		break;
+
+	case 71: {
+		_raoulStatus = 2;
+		int *val1 = _vm->_gameConv->getVariable(24);
+		int *val2 = _vm->_gameConv->getVariable(26);
+		if ((*val1) && (*val2)) {
+			_globals[kDoneRichConv203] = true;
+			_globals[kMadameGiryShowsUp] = true;
+		}
+		}
+		break;
+
+	case 74:
+		_vm->_gameConv->hold();
+		_raoulStatus = 3;
+		break;
+
+	case 81:
+		_richardStatus = 2;
+		break;
+
+	case 83:
+		_richardStatus = 1;
+		break;
+
+	case 85:
+		_richardStatus = 3;
+		break;
+
+	case 100:
+		_richardStatus = 0;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl && (_raoulStatus != 5))
+		_vm->_gameConv->setHeroTrigger(65);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(100);
+
+	_brieCount = 0;
+	_raoulCount = 0;
+}
+
+void Scene203::handleRichardAndDaaeConversation() {
+	bool interlocutorFl = false;
+	bool heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 5:
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+
+			_vm->_sound->command(24);
+			_scene->deleteSequence(_globals._sequenceIndexes[5]);
+			_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 90);
+			interlocutorFl = true;
+			heroFl = true;
+		}
+		break;
+
+	case 11:
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_daaeStatus = 3;
+		}
+		break;
+
+	case 13:
+	case 14:
+	case 15:
+		_globals[kChristineDoorStatus] = 1;
+		_globals[kTicketPeoplePresent] = 2;
+		heroFl = true;
+		interlocutorFl = true;
+		_vm->_gameConv->setInterlocutorTrigger(115);
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 65:
+		if (_globals[kWalkerConverse] != 0)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+
+		if ((_richardStatus != 5) && (_richardStatus != 7))
+			_richardStatus = 4;
+
+		_conversationCount = 0;
+		break;
+
+	case 90:
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+		_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('d', 1), 0);
+		_anim3ActvFl = true;
+		_daaeStatus = 0;
+		break;
+
+	case 100:
+		if (_globals[kWalkerConverse] != 0)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+
+		if ((_action._activeAction._verbId == 7) || (_action._activeAction._verbId == 9))
+			_daaeStatus = 1;
+		else if (_richardStatus == 7)
+			_richardStatus = 5;
+		else if (_richardStatus != 5)
+			_richardStatus = 0;
+
+		break;
+
+	case 115:
+		_globals[kWalkerConverse] = 0;
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(65);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(100);
+
+	_brieCount = 0;
+	_raoulCount = 0;
+}
+
+void Scene203::handleBrieAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _brieFrame)
+		return;
+
+	_brieFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random = -1;
+
+	switch (_brieFrame) {
+	case 1:
+	case 2:
+	case 4:
+	case 11:
+	case 22:
+	case 31:
+	case 35:
+	case 29:
+		random = _vm->getRandomNumber(6, 45);
+
+		switch (_brieStatus) {
+		case 0:
+			random = _vm->getRandomNumber(1, 2);
+			++_brieCount;
+			if (_brieCount > 20) {
+				_brieStatus = 4;
+				random = 45;
+			}
+			break;
+
+		case 1:
+			random = 5;
+			break;
+
+		case 2:
+			random = 4;
+			break;
+
+		case 3:
+			random = 3;
+			_brieStatus = 0;
+			break;
+
+		default:
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 0;
+			break;
+
+		case 2:
+			resetFrame = 1;
+			break;
+
+		case 3:
+			resetFrame = 2;
+			break;
+
+		case 4:
+			resetFrame = 22;
+			_brieStatus = 0;
+			break;
+
+		case 5:
+			resetFrame = 13;
+			break;
+
+		case 6:
+			resetFrame = 4;
+			break;
+
+		case 7:
+			resetFrame = 29;
+			break;
+
+		case 8:
+			resetFrame = 31;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+
+	case 30:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_brieStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 30;
+		else
+			resetFrame = 29;
+
+		break;
+
+	case 8:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_brieStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			random = 3;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 11;
+			break;
+
+		case 2:
+			resetFrame = 12;
+			break;
+
+		case 3:
+			resetFrame = 8;
+			break;
+
+		default:
+			resetFrame = 7;
+			break;
+		}
+		break;
+
+	case 12:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_brieStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 7;
+		else
+			resetFrame = 11;
+
+		break;
+
+	case 13:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_brieStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 7;
+		else
+			resetFrame = 12;
+
+		break;
+
+	case 17:
+	case 18:
+		switch (_brieStatus) {
+		case 0:
+		case 2:
+		case 3:
+			random = 3;
+			break;
+		case 1:
+			random = _vm->getRandomNumber(1, 2);
+			++_brieCount;
+			if (_brieCount > 20) {
+				_brieStatus = 4;
+				random = 3;
+			}
+			break;
+
+		default:
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 16;
+			break;
+
+		case 2:
+			resetFrame = 17;
+			break;
+
+		case 3:
+			resetFrame = 18;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 33:
+	case 40:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_brieStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			random = 1;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 33;
+			break;
+
+		case 2:
+			resetFrame = 35;
+			break;
+
+		default:
+			resetFrame = 32;
+			break;
+		}
+		break;
+
+	case 38:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_brieStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 38;
+		else
+			resetFrame = 37;
+
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_brieFrame = resetFrame;
+	}
+}
+
+void Scene203::handleRichardAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _richardFrame)
+		return;
+
+	_richardFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random = -1;
+
+	switch (_richardFrame) {
+	case 1:
+	case 2:
+	case 3:
+	case 7:
+	case 15:
+	case 25:
+	case 37:
+	case 53:
+	case 59:
+	case 63:
+	case 67:
+	case 69:
+	case 79:
+	case 87:
+	case 108:
+		random = _vm->getRandomNumber(8, 45);
+
+		switch (_richardStatus) {
+		case 0:
+			random = _vm->getRandomNumber(1, 3);
+			++_brieCount;
+			if (_brieCount > 20) {
+				_richardStatus = 4;
+				random = 45;
+			}
+			break;
+
+		case 1:
+			random = 4;
+			_richardStatus = 0;
+			break;
+
+		case 2:
+			random = 5;
+			_richardStatus = 0;
+			break;
+
+		case 3:
+			random = 6;
+			_richardStatus = 0;
+			break;
+
+		case 5:
+			random = 7;
+			break;
+
+		default:
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 0;
+			break;
+
+		case 2:
+			resetFrame = 1;
+			break;
+
+		case 3:
+			resetFrame = 2;
+			break;
+
+		case 4:
+			resetFrame = 69;
+			break;
+
+		case 5:
+			resetFrame = 53;
+			_richardStatus = 0;
+			break;
+
+		case 6:
+			resetFrame = 42;
+			break;
+
+		case 7:
+			resetFrame = 87;
+			break;
+
+		case 8:
+			resetFrame = 25;
+			break;
+
+		case 9:
+			resetFrame = 15;
+			break;
+
+		case 10:
+			resetFrame = 3;
+			break;
+
+		case 11:
+			resetFrame = 7;
+			break;
+
+		case 12:
+			resetFrame = 59;
+			break;
+
+		case 13:
+			resetFrame = 63;
+			break;
+
+		case 14:
+			resetFrame = 67;
+			break;
+
+		case 15:
+			resetFrame = 79;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+
+	case 5:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+		case 5:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 5;
+		else
+			resetFrame = 4;
+
+		break;
+
+	case 11:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+		case 5:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 11;
+		else
+			resetFrame = 10;
+
+		break;
+
+	case 61:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+		case 5:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 61;
+		else
+			resetFrame = 60;
+
+		break;
+
+	case 65:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+		case 5:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 65;
+		else
+			resetFrame = 64;
+
+		break;
+
+	case 68:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+		case 5:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 68;
+		else
+			resetFrame = 67;
+
+		break;
+
+	case 83:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+		case 5:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 83;
+		else
+			resetFrame = 82;
+
+		break;
+
+	case 92:
+		_vm->_gameConv->release();
+		break;
+
+	case 93:
+	case 94:
+	case 95:
+		if (_richardStatus == 5) {
+			random = _vm->getRandomNumber(1, 3);
+			++_brieCount;
+			if (_brieCount > 20) {
+				_richardStatus = 7;
+				random = 4;
+			}
+		} else
+			random = 4;
+
+		switch (random) {
+		case 1:
+			resetFrame = 92;
+			break;
+
+		case 2:
+			resetFrame = 93;
+			break;
+
+		case 3:
+			resetFrame = 94;
+			break;
+
+		case 4:
+			resetFrame = 95;
+			break;
+		}
+		break;
+
+	case 100:
+	case 101:
+	case 102:
+		switch (_richardStatus) {
+		case 5:
+			random = _vm->getRandomNumber(1, 3);
+			++_brieCount;
+			if (_brieCount > 20) {
+				_richardStatus = 7;
+				random = 1;
+			}
+			break;
+
+		case 7:
+			random = 1;
+			break;
+
+		default:
+			random = 4;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 99;
+			break;
+
+		case 2:
+			resetFrame = 100;
+			break;
+
+		case 3:
+			resetFrame = 101;
+			break;
+
+		case 4:
+			resetFrame = 102;
+			break;
+
+		default:
+			break;
+		}
+		break;
+
+	case 31:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_richardStatus) {
+		case 0 :
+		case 1:
+		case 2:
+		case 3:
+		case 5:
+			random = 1;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 31;
+		else
+			resetFrame = 30;
+
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
+		_richardFrame = resetFrame;
+	}
+}
+
+
+void Scene203::handleRaoulAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _raoulFrame)
+		return;
+
+	_raoulFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random = -1;
+
+	switch (_raoulFrame) {
+	case 9:
+	case 21:
+	case 57:
+		_vm->_gameConv->release();
+		break;
+
+	case 10:
+	case 22:
+	case 30:
+	case 34:
+	case 58:
+		if (_raoulFrame == 22)
+			_raoulStatus = 0;
+
+		random = _vm->getRandomNumber(5, 45);
+
+		switch (_raoulStatus) {
+		case 1:
+			random = 1;
+			break;
+
+		case 2:
+			_game._player._stepEnabled = false;
+			random = 2;
+			break;
+
+		case 3:
+		case 5:
+			random = 3;
+			break;
+
+		case 4:
+			random = 4;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(5, 100);
+			break;
+			}
+
+		switch (random) {
+		case 1:
+			resetFrame = 22;
+			break;
+
+		case 2:
+			resetFrame = 34;
+			break;
+
+		case 3:
+			resetFrame = 10;
+			break;
+
+		case 4:
+			resetFrame = 45;
+			break;
+
+		case 5:
+			resetFrame = 30;
+			break;
+
+		default:
+			resetFrame = 9;
+			break;
+		}
+		break;
+
+	case 16:
+		switch (_raoulStatus) {
+		case 3:
+			random = 1;
+			break;
+
+		case 0:
+		case 2:
+			random = 2;
+			break;
+
+		case 5:
+			random = 3;
+			break;
+
+		default:
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			if (_globals[kCurrentYear] == 1881) {
+				resetFrame = 16;
+				_scene->deleteSequence(_globals._sequenceIndexes[1]);
+				_scene->_hotspots.activate(NOUN_NOTICE, false);
+				_game._objects.addToInventory(OBJ_NOTICE);
+				_vm->_sound->command(26);
+				_scene->_speechReady = -1;
+				_vm->_dialogs->showItem(OBJ_NOTICE, 814, 5);
+				_raoulStatus = 0;
+			} else {
+				resetFrame = 16;
+				_scene->deleteSequence(_globals._sequenceIndexes[1]);
+				_scene->_hotspots.activate(NOUN_PARCHMENT, false);
+				_game._objects.addToInventory(OBJ_PARCHMENT);
+				_vm->_sound->command(26);
+				_scene->_speechReady = -1;
+				_vm->_dialogs->showItem(OBJ_PARCHMENT, 812, 3);
+				_raoulStatus = 0;
+			}
+			break;
+
+		case 2:
+			if (_showNoteFl) {
+				_scene->deleteSequence(_globals._sequenceIndexes[2]);
+				_showNoteFl = false;
+			}
+			break;
+
+		default:
+			if (!_showNoteFl) {
+				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], true, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
+				_vm->_gameConv->release();
+				_showNoteFl = true;
+			}
+			resetFrame = 15;
+			break;
+		}
+		break;
+
+	case 26:
+		random = _vm->getRandomNumber(1, 45);
+
+		switch (_raoulStatus) {
+		case 0:
+		case 2:
+		case 3:
+		case 4:
+		case 5:
+			random = 1;
+			break;
+
+		case 1:
+			random = 2;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 26;
+		else
+			resetFrame = 25;
+
+		break;
+
+	case 45:
+		_anim1ActvFl = false;
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		resetFrame = 58;
+		if ((_globals[kDoneBrieConv203]) && (_globals[kCurrentYear] == 1993)) {
+			_globals[kPrompterStandStatus] = 1;
+			_scene->_nextSceneId = 150;
+		}
+		break;
+
+	case 52:
+		_scene->deleteSequence(_globals._sequenceIndexes[3]);
+		_scene->_hotspots.activate(NOUN_LETTER, false);
+		_game._objects.addToInventory(OBJ_LETTER);
+		_vm->_sound->command(26);
+		_scene->_speechReady = -1;
+		_vm->_dialogs->showItem(OBJ_LETTER, 813, 4);
+		_raoulStatus = 0;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_raoulFrame = resetFrame;
+	}
+}
+
+
+void Scene203::handleDaaeAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _daaeFrame)
+		return;
+
+	_daaeFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random = -1;
+
+	switch (_daaeFrame) {
+	case 20:
+		_vm->_gameConv->release();
+		_richardStatus = 5;
+		break;
+
+	case 175:
+		_richardStatus = 4;
+		break;
+
+	case 198:
+		_vm->_gameConv->release();
+		break;
+
+	case 201:
+		_scene->_sequences.setTimingTrigger(1, 95);
+		break;
+
+	case 76:
+	case 92:
+	case 102:
+	case 123:
+		switch (_daaeStatus) {
+		case 1:
+			random = _vm->getRandomNumber(1, 2);
+			_daaeStatus = 2;
+			break;
+
+		case 2:
+			random = 3;
+			_daaeStatus = 0;
+			break;
+
+		case 3:
+			random = 4;
+			break;
+
+		default:
+			random = 5;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 79;
+			break;
+
+		case 2:
+			resetFrame = 92;
+			break;
+
+		case 3:
+			resetFrame = 102;
+			break;
+
+		case 4:
+			resetFrame = 123;
+			break;
+
+		case 5:
+			resetFrame = 75;
+			break;
+
+		default:
+			break;
+		}
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[3], resetFrame);
+		_daaeFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index cff6640..82dfc99 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -110,6 +110,45 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene203 : public Scene2xx {
+private:
+	bool _anim0ActvFl;  
+	bool _anim1ActvFl;  
+	bool _anim2ActvFl;  
+	bool _anim3ActvFl;  
+	bool _showNoteFl;
+
+	int _brieStatus;
+	int _brieFrame;
+	int _brieCount;
+	int _raoulStatus;
+	int _raoulFrame;
+	int _raoulCount;
+	int _richardStatus;
+	int _richardFrame;
+	int _daaeStatus;
+	int _daaeFrame;
+	int _conversationCount;
+
+	void handleBrieConversation();
+	void handleRichardConversation();
+	void handleRichardAndDaaeConversation();
+	void handleBrieAnimation();
+	void handleRichardAnimation();
+	void handleRaoulAnimation();
+	void handleDaaeAnimation();
+	
+public:
+	Scene203(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 6101be6..4c48619 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -63,6 +63,8 @@ Scene::Scene(MADSEngine *vm)
 	_variant = 0;
 	_initialVariant = 0;
 
+	_speechReady = -1;
+
 	_paletteUsageF.push_back(PaletteUsage::UsageEntry(0xF));
 
 	// Set up a scene surface that maps to our physical screen drawing surface
@@ -811,6 +813,9 @@ void Scene::loadSpeech(int idx) {
 	_vm->_audio->setDefaultSoundGroup();
 	// NOTE: The original actually preloads the speech sample here, but the samples
 	// are so small that it's not really worth it...
+
+	// TODO: As the speech samples aren't cached anymore, _speechReady should be remove
+	_speechReady = idx;
 }
 
 void Scene::playSpeech(int idx) {
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index b818a02..2246516 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -265,6 +265,7 @@ public:
 	void playSpeech(int idx);
 	void sceneScale(int front_y, int front_scale, int back_y,  int back_scale);
 	void animations_tick();
+	int _speechReady;
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/sound.cpp b/engines/mads/sound.cpp
index 4a35edb..c96fd01 100644
--- a/engines/mads/sound.cpp
+++ b/engines/mads/sound.cpp
@@ -39,6 +39,8 @@ SoundManager::SoundManager(MADSEngine *vm, Audio::Mixer *mixer) {
 	_newSoundsPaused = false;
 	_masterVolume = 255;
 
+	_preferRoland = false;
+
 	_opl = OPL::Config::create();
 	_opl->init();
 
diff --git a/engines/mads/sound.h b/engines/mads/sound.h
index 9882f65..a9cdedd 100644
--- a/engines/mads/sound.h
+++ b/engines/mads/sound.h
@@ -48,6 +48,8 @@ public:
 	SoundManager(MADSEngine *vm, Audio::Mixer *mixer);
 	~SoundManager();
 
+	bool _preferRoland;
+
 	/**
 	 * Initializes the sound driver for a given game section
 	 */


Commit: adfe7de5abe8d562d4b6a4b6534d74dec0a6ace7
    https://github.com/scummvm/scummvm/commit/adfe7de5abe8d562d4b6a4b6534d74dec0a6ace7
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-25T19:05:28+01:00

Commit Message:
MADS: Phantom: change the type of a couple of local variables

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 439c6c5..4aeed51 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -349,7 +349,7 @@ void Scene101::handleConversation0() {
 
 void Scene101::handleConversation1() {
 	if ((_action._activeAction._verbId >= 0) && (_action._activeAction._verbId <= 27)) {
-		int interlocutorFl = false;
+		bool interlocutorFl = false;
 
 		if (_game._trigger == 60) {
 			switch (_action._activeAction._verbId) {
@@ -2323,7 +2323,7 @@ void Scene103::descendLeftStairs() {
 }
 
 void Scene103::process_conv_jacques() {
-	int quitConversationFl = false;
+	bool quitConversationFl = false;
 
 	switch (_action._activeAction._verbId) {
 	case 1:


Commit: 98b52670c9fa2f87dec7695c310dfa3fbb69e0e2
    https://github.com/scummvm/scummvm/commit/98b52670c9fa2f87dec7695c310dfa3fbb69e0e2
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-26T01:24:16+01:00

Commit Message:
MADS: Phantom: Implement scene 204

Changed paths:
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 1dbe760..22344d3 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -817,7 +817,7 @@ void Scene202::actions() {
 		return;
 	}
 
-	if ((_action.isAction(VERB_TALK_TO, NOUN_GENTLEMAN)) || (_action.isAction(VERB_TALK_TO, NOUN_EDGAR_DEGAS))) {
+	if (_action.isAction(VERB_TALK_TO, NOUN_GENTLEMAN) || _action.isAction(VERB_TALK_TO, NOUN_EDGAR_DEGAS)) {
 		if (!_globals[kDegasNameIsKnown] ) {
 			_vm->_gameConv->run(9);
 			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
@@ -1025,7 +1025,7 @@ void Scene202::preActions() {
 	if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR))
 		_game._player.walk(Common::Point(126, 123), FACING_NORTHEAST);
 
-	if ((_globals[kTicketPeoplePresent] == 2) && (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_ARCHWAY)))
+	if ((_globals[kTicketPeoplePresent] == 2) && _action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_ARCHWAY))
 		_game._player.walk(Common::Point(569, 147), FACING_NORTHEAST);
 
 	if (_action.isAction(VERB_TAKE, NOUN_GENTLEMAN) || _action.isAction(VERB_TAKE, NOUN_EDGAR_DEGAS))
@@ -3140,7 +3140,7 @@ void Scene203::handleRaoulAnimation() {
 		_game._player._stepEnabled = true;
 		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
 		resetFrame = 58;
-		if ((_globals[kDoneBrieConv203]) && (_globals[kCurrentYear] == 1993)) {
+		if (_globals[kDoneBrieConv203] && (_globals[kCurrentYear] == 1993)) {
 			_globals[kPrompterStandStatus] = 1;
 			_scene->_nextSceneId = 150;
 		}
@@ -3252,5 +3252,956 @@ void Scene203::handleDaaeAnimation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene204::Scene204(MADSEngine *vm) : Scene2xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+	_raoulDown = false;
+	_florentGone = false;
+	_skip1Fl = false;
+	_skip2Fl = false;
+	_skip3Fl = false;
+	_endGameFl = false;
+
+	_brieStatus = -1;
+	_brieFrame = -1;
+	_florStatus = -1;
+	_florFrame = -1;
+	_raoulStatus = -1;
+	_raoulFrame = -1;
+	_raoulCount = -1;
+}
+
+void Scene204::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_anim3ActvFl);
+	s.syncAsByte(_raoulDown);
+	s.syncAsByte(_florentGone);
+	s.syncAsByte(_skip1Fl);
+	s.syncAsByte(_skip2Fl);
+	s.syncAsByte(_skip3Fl);
+	s.syncAsByte(_endGameFl);
+
+	s.syncAsSint16LE(_brieStatus);
+	s.syncAsSint16LE(_brieFrame);
+	s.syncAsSint16LE(_florStatus);
+	s.syncAsSint16LE(_florFrame);
+	s.syncAsSint16LE(_raoulStatus);
+	s.syncAsSint16LE(_raoulFrame);
+	s.syncAsSint16LE(_raoulCount);
+}
+
+void Scene204::setup() {
+	if ((_globals[kCurrentYear] == 1993) || _globals[kRightDoorIsOpen504])
+		_scene->_initialVariant = 1;
+
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene204::enter() {
+	_skip3Fl = false;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+		_anim3ActvFl = false;
+		_florentGone = false;
+		_skip1Fl = false;
+		_skip2Fl = false;
+		_endGameFl = false;
+		_raoulDown = true;
+	}
+
+	if (_globals[kTicketPeoplePresent] == 2)
+		_globals[kMakeRichLeave203] = true;
+
+	if (_globals[kRightDoorIsOpen504])
+		_endGameFl = true;
+
+	warning("TODO: If end of game, remove the walking areas");
+
+	_scene->_hotspots.activate(NOUN_BOOK, false);
+	_vm->_gameConv->get(22);
+
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 6), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RALRH_9", false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RDRR_6", false);
+
+	if (_game._objects.isInRoom(OBJ_BOOK) || (_globals[kCurrentYear] == 1881) || _endGameFl) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 5);
+		if (_globals[kScannedBookcase] && (_globals[kCurrentYear] == 1993))
+			_scene->_hotspots.activate(NOUN_BOOK, true);
+	}
+
+	if ((_globals[kCurrentYear] == 1993) || _endGameFl) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_sprites.remove(_globals._spriteIndexes[0]);
+		_scene->_hotspots.activate(NOUN_CANDLE, false);
+		_scene->_hotspots.activate(NOUN_BUST, false);
+		_scene->_hotspots.activate(NOUN_COFFEE_TABLE, false);
+
+		int idx = _scene->_dynamicHotspots.add(NOUN_COFFEE_TABLE, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(83, 140, 83 + 45, 140 + 12));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(84, 150), FACING_SOUTHEAST);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_GRAND_FOYER, VERB_EXIT_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(199, 147, 199 + 52, 147 + 8));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(224, 152), FACING_SOUTH);
+		_scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_GRAND_FOYER, VERB_EXIT_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(145, 147, 145 + 54, 147 + 8));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 152), FACING_SOUTH);
+		_scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
+	} else {
+		_scene->_hotspots.activate(NOUN_LIGHT, false);
+		_scene->_hotspots.activate(NOUN_GLASS_CASE, false);
+
+		int idx = _scene->_dynamicHotspots.add(NOUN_COMFY_CHAIR, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(220, 147, 220 + 6, 147 + 8));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(220, 150), FACING_SOUTHEAST);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_COMFY_CHAIR, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(226, 134, 226 + 12, 134 + 21));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(220, 150), FACING_SOUTHEAST);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_COMFY_CHAIR, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(238, 128, 238 + 13, 128 + 27));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(220, 150), FACING_SOUTHEAST);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_GRAND_FOYER, VERB_EXIT_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(199, 147, 199 + 19, 147 + 8));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(209, 152), FACING_SOUTH);
+		_scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_GRAND_FOYER, VERB_EXIT_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(84, 147, 84 + 61, 147 + 8));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(115, 152), FACING_SOUTH);
+		_scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
+	}
+
+	if ((_scene->_priorSceneId == 306) || (_endGameFl)) {
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
+	} else if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_sprites.remove(_globals._spriteIndexes[1]);
+	}
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		if (_endGameFl) {
+			_game.loadQuoteSet(0x75, 0);
+
+			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 0);
+			_anim2ActvFl = true;
+
+			if (_florentGone) {
+				_scene->setAnimFrame(_globals._animationIndexes[2], 9);
+				_raoulStatus = 1;
+			} else {
+				_scene->setAnimFrame(_globals._animationIndexes[2], 32);
+				_raoulStatus = 4;
+			}
+
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 0);
+			_anim0ActvFl = true;
+			_brieStatus = 2;
+
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0);
+			_anim1ActvFl = true;
+			_florStatus = 2;
+
+			if (_florentGone)
+				_scene->setAnimFrame(_globals._animationIndexes[1], 172);
+			else if (!_raoulDown)
+				_scene->setAnimFrame(_globals._animationIndexes[1], 21);
+
+			_game._player._visible = false;
+			_vm->_gameConv->run(22);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		} else {
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+		}
+	} else if (_scene->_priorSceneId == 202) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+		if (_globals[kCurrentYear] == 1993)
+			_game._player._playerPos = Common::Point(175, 145);
+		else
+			_game._player._playerPos = Common::Point(115, 147);
+
+		_game._player._facing = FACING_NORTHWEST;
+	} else if (_scene->_priorSceneId == 150) {
+		int size = _game._objects.size();
+		for (int i = 0; i < size; i++)
+			_game._objects.setRoom(i, 1);
+
+		_game.loadQuoteSet(0x75, 0);
+
+		_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 0);
+		_anim2ActvFl = true;
+		_raoulStatus = 4;
+		_scene->setAnimFrame(_globals._animationIndexes[2], 32);
+
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 0);
+		_anim0ActvFl = true;
+		_brieStatus = 2;
+
+		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0);
+		_anim1ActvFl = true;
+		_raoulDown = true;
+		_florStatus = 2;
+
+		_game._player._visible = false;
+		_endGameFl = true;
+
+		_vm->_gameConv->run(22);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+	} else if ((_scene->_priorSceneId == 203) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player.firstWalk(Common::Point(-10, 136), FACING_EAST, Common::Point(30, 140), FACING_EAST, true);
+		_game._player.setWalkTrigger(70);
+		_game._player._stepEnabled = false;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene204::step() {
+	if (_anim0ActvFl)
+		handleBrieAnimation();
+
+	if (_anim1ActvFl)
+		handleFlorAnimation();
+
+	if (_anim2ActvFl)
+		handleRaoulAnimation();
+
+	if (_anim3ActvFl)
+		handleEndAnimation();
+
+	if (_game._trigger == 85)
+		_scene->_nextSceneId = 250;
+
+	if ((_vm->_gameConv->_running != 22) && !_skip1Fl && _endGameFl) {
+		_game._player._stepEnabled = false;
+		_skip1Fl = true;
+	}
+
+	if (_game._trigger == 70) {
+		 _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+		 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
+		 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+		 _scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 71);
+	} else if (_game._trigger == 71) {
+		 _vm->_sound->command(25);
+		 _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+		 _game._player._stepEnabled = true;
+	}
+}
+
+void Scene204::actions() {
+	if (_vm->_gameConv->_running == 22) {
+		handleConversation();
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 4, 60);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 61);
+			break;
+
+		case 60:
+			_vm->_sound->command(24);
+			_scene->deleteSequence(_globals._sequenceIndexes[3]);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+			break;
+
+		case 61:
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+			_game._player.walk(Common::Point(0, 136), FACING_WEST);
+			_game._player.setWalkTrigger(62);
+			break;
+
+		case 62:
+			_scene->_nextSceneId = 203;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BOOK) && (_game._objects.isInRoom(OBJ_BOOK) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 8, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 2);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[2]);
+			_scene->_hotspots.activate(NOUN_BOOK, false);
+			_game._objects.addToInventory(OBJ_BOOK);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[4]);
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			_vm->_dialogs->showItem(OBJ_BOOK, 815, 0);
+			_globals[kReadBook] = true;
+			_globals[kPlayerScore] += 5;
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_GRAND_FOYER)) {
+		_scene->_nextSceneId = 202;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(20410);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(20411);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(20412);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RUG)) {
+			_vm->_dialogs->show(20413);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GLASS_CASE)) {
+			_vm->_dialogs->show(20414);
+			_globals[kLookedAtCase] = true;
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			if (_globals[kSandbagStatus] == 0)
+				_vm->_dialogs->show(20429);
+			else
+				_vm->_dialogs->show(20416);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOOKCASE)) {
+			if (_globals[kCanFindBookInLibrary] && (_globals[kCurrentYear] == 1993)) {
+				if ((_scene->_customDest.x < 46) && !_game._objects.isInInventory(OBJ_BOOK)) {
+					if (!_globals[kScannedBookcase]) {
+						_vm->_dialogs->show(20433);
+						_scene->_hotspots.activate(NOUN_BOOK, true);
+						_globals[kScannedBookcase] = true;
+					} else {
+						_vm->_dialogs->show(20437);
+					}
+				} else {
+					_vm->_dialogs->show(20417);
+				}
+			} else {
+				_vm->_dialogs->show(20417);
+			}
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SOFA)) {
+			_vm->_dialogs->show(20418);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_END_TABLE)) {
+			_vm->_dialogs->show(20419);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LAMP)) {
+			_vm->_dialogs->show(20420);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BUST)) {
+			_vm->_dialogs->show(20421);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_COFFEE_TABLE)) {
+			_vm->_dialogs->show(20422);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_COMFY_CHAIR)) {
+			_vm->_dialogs->show(20423);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DECORATIVE_VASE )) {
+			_vm->_dialogs->show(20424);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PAINTING)) {
+			_vm->_dialogs->show(20425);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GRAND_FOYER)) {
+			_vm->_dialogs->show(20426);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR)) {
+			_vm->_dialogs->show(20427);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WINDOW)) {
+			_vm->_dialogs->show(20428);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOOK) && _game._objects.isInRoom(OBJ_BOOK)) {
+			_vm->_dialogs->show(20434);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_BUST)) {
+		_vm->_dialogs->show(20436);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene204::preActions() {
+	if (_action.isAction(VERB_LOOK, NOUN_BOOKCASE))
+		_game._player._needToWalk = true;
+
+	if (_action.isAction(VERB_LOOK, NOUN_BOOK) && _game._objects.isInRoom(OBJ_BOOK))
+		_game._player._needToWalk = true;
+
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+		_game._player.walk(Common::Point(27, 139), FACING_WEST);
+}
+
+void Scene204::handleConversation() {
+	bool interlocutorFl = false;
+	bool heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 6:
+	case 7:
+	case 8:
+		if (_raoulDown) {
+			_vm->_gameConv->hold();
+			_raoulDown = false;
+		}
+		break;
+
+	case 17:
+		if (!_game._trigger) {
+			_florStatus = 3;
+			_florentGone = true;
+			interlocutorFl = true;
+			heroFl = true;
+			_vm->_gameConv->hold();
+		}
+		break;
+
+	case 25:
+		if (!_game._trigger) {
+			_raoulStatus = 5;
+			_florStatus = 5;
+			interlocutorFl = true;
+			heroFl = true;
+			_vm->_gameConv->hold();
+		}
+		break;
+
+	case 29:
+		interlocutorFl = true;
+		heroFl = true;
+		if (!_game._trigger) {
+			_brieStatus = 3;
+			_vm->_gameConv->hold();
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 75:
+		if (_florentGone) {
+			if (_raoulStatus != 2)
+				_raoulStatus = 0;
+		} else
+			_florStatus = 4;
+
+		break;
+
+	case 80:
+		if (_florentGone) {
+			if ((_action._activeAction._verbId != 18) && (_action._activeAction._verbId != 23))
+				_brieStatus = 0;
+		} else {
+			switch (_action._activeAction._verbId) {
+			case 1:
+			case 7:
+			case 8:
+			case 9:
+			case 13:
+			case 15:
+			case 19:
+			case 20:
+			case 21:
+			case 22:
+				_brieStatus = 0;
+				break;
+
+			default:
+				_florStatus = 0;
+				break;
+			}
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl && !_raoulDown)
+		_vm->_gameConv->setHeroTrigger(75);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(80);
+
+	_raoulCount = 0;
+}
+
+void Scene204::handleBrieAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _brieFrame)
+		return;
+
+	_brieFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random;
+
+	switch (_brieFrame) {
+	case 80:
+		_vm->_gameConv->release();
+		_raoulStatus = 2;
+		break;
+
+	case 173:
+		_game._player._stepEnabled = true;
+		_vm->_dialogs->show(20430);
+		_game._player._stepEnabled = false;
+		break;
+
+	case 174:
+		_raoulStatus = 3;
+		resetFrame = 173;
+		break;
+
+	case 1:
+	case 22:
+	case 49:
+	case 7:
+	case 13:
+	case 33:
+	case 61:
+		switch (_brieStatus) {
+		case 0:
+			random = _vm->getRandomNumber(1, 4);
+			_brieStatus = 2;
+			break;
+
+		case 1:
+			random = 5;
+			break;
+
+		case 3:
+			random = 6;
+			break;
+
+		case 4:
+			random = 7;
+			break;
+
+		default:
+			random = 8;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 1;
+			_brieStatus = 2;
+			break;
+
+		case 2:
+			resetFrame = 7;
+			_brieStatus = 2;
+			break;
+
+		case 3:
+			resetFrame = 22;
+			_brieStatus = 2;
+			break;
+
+		case 4:
+			resetFrame = 49;
+			_brieStatus = 2;
+			break;
+
+		case 5:
+			resetFrame = 13;
+			_brieStatus = 2;
+			break;
+
+		case 6:
+			resetFrame = 61;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_brieFrame = resetFrame;
+	}
+}
+
+void Scene204::handleFlorAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _florFrame)
+		return;
+
+	_florFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random;
+
+	switch (_florFrame) {
+	case 80:
+		_scene->setAnimFrame(_globals._animationIndexes[2], 1);
+		_game.syncTimers(3, _globals._animationIndexes[2], 3, _globals._animationIndexes[1]);
+		_raoulStatus = 1;
+		break;
+
+	case 86:
+		_vm->_gameConv->release();
+		break;
+
+	case 173:
+		resetFrame = 172;
+		break;
+
+	case 1:
+	case 2:
+	case 3:
+		if (_raoulDown) {
+			random = _vm->getRandomNumber(1, 1000);
+			if (random < 300)
+				resetFrame = 0;
+			else if (random < 600)
+				resetFrame = 1;
+			else
+				resetFrame = 2;
+		}
+		break;
+
+	case 21:
+	case 180:
+		_vm->_gameConv->release();
+		break;
+
+	case 22:
+	case 50:
+	case 30:
+	case 174:
+	case 175:
+	case 176:
+	case 181:
+		switch (_florStatus) {
+		case 0:
+			random = 1;
+			_florStatus = 2;
+			break;
+
+		case 1:
+			random = 2;
+			_florStatus = 2;
+			break;
+
+		case 3:
+			random = 3;
+			break;
+
+		case 5:
+			random = 4;
+			_florStatus = 2;
+			break;
+
+		case 4:
+			random = _vm->getRandomNumber(5, 7);
+			++_raoulCount;
+			if (_raoulCount > 17) {
+				_florStatus = 2;
+				random = 8;
+			}
+			break;
+
+		default:
+			random = 7;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 22;
+			break;
+
+		case 2:
+			resetFrame = 30;
+			break;
+
+		case 3:
+			resetFrame = 53;
+			break;
+
+		case 4:
+			resetFrame = 176;
+			break;
+
+		case 5:
+			resetFrame = 173;
+			break;
+
+		case 6:
+			resetFrame = 174;
+			break;
+
+		case 7:
+			resetFrame = 175;
+			break;
+
+		default:
+			resetFrame = 21;
+			break;
+		}
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_florFrame = resetFrame;
+	}
+}
+
+void Scene204::handleRaoulAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _raoulFrame)
+		return;
+
+	_raoulFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
+	int resetFrame = -1;
+	int random;
+
+	switch (_raoulFrame) {
+	case 1:
+		if (_raoulStatus == 4)
+			resetFrame = 0;
+
+		break;
+
+	case 10:
+	case 14:
+	case 20:
+	case 258:
+		switch (_raoulStatus) {
+		case 0:
+			random = _vm->getRandomNumber(1, 2);
+			_raoulStatus = 1;
+			break;
+
+		case 2:
+			random = 3;
+			break;
+
+		case 5:
+			random = 4;
+			break;
+
+		default:
+			random = 5;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 10;
+			_raoulStatus = 1;
+			break;
+
+		case 2:
+			resetFrame = 14;
+			_raoulStatus = 1;
+			break;
+
+		case 3:
+			resetFrame = 20;
+			break;
+
+		case 4:
+			resetFrame = 253;
+			_raoulStatus = 1;
+			break;
+
+		default:
+			resetFrame = 9;
+			break;
+		}
+		break;
+
+	case 31:
+		if (_raoulStatus == 3)
+			resetFrame = 33;
+		else
+			resetFrame = 30;
+
+		break;
+
+	case 33:
+		resetFrame = 32;
+		break;
+
+	case 114:
+		_scene->deleteSequence(_globals._sequenceIndexes[2]);
+		_game._objects.addToInventory(OBJ_BOOK);
+		break;
+
+	case 213:
+		_game._player._stepEnabled = true;
+		_vm->_dialogs->showItem(OBJ_BOOK, 20431, 0);
+		_game._player._stepEnabled = false;
+		break;
+
+	case 229:
+		_game._player._stepEnabled = true;
+		_vm->_dialogs->showItem(OBJ_BOOK, 20432, 0);
+		_game._player._stepEnabled = false;
+		break;
+
+	case 237:
+		_scene->freeAnimation(_globals._animationIndexes[1]);
+		_scene->freeAnimation(_globals._animationIndexes[0]);
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim3ActvFl = true;
+		_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('e', 1), 0);
+		_scene->loadSpeech(9);
+		break;
+
+	case 253:
+		resetFrame = 244;
+		break;
+
+	case 257:
+		_vm->_gameConv->release();
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
+		_raoulFrame = resetFrame;
+	}
+}
+
+void Scene204::handleEndAnimation() {
+	if ((_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 15) && !_skip3Fl) {
+		_scene->playSpeech(9);
+		_skip3Fl = true;
+	}
+
+	if ((_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 26) && !_skip2Fl) {
+		_scene->_sequences.setTimingTrigger(300, 85);
+		_scene->_kernelMessages.add(Common::Point(123, 137), 0x1110, 0, 0, 360, _game.getQuote(0x75));
+		_skip2Fl = true;
+	}
+
+	if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 27)
+		_scene->setAnimFrame(_globals._animationIndexes[3], 12);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index 82dfc99..99e0e20 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -149,6 +149,45 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene204 : public Scene2xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _anim3ActvFl;
+	bool _raoulDown;
+	bool _florentGone;
+	bool _skip1Fl;
+	bool _skip2Fl;
+	bool _skip3Fl;
+	bool _endGameFl;
+
+	int _brieStatus;
+	int _brieFrame;
+	int _florStatus;
+	int _florFrame;
+	int _raoulStatus;
+	int _raoulFrame;
+	int _raoulCount;
+
+	void handleConversation();
+	void handleBrieAnimation();
+	void handleFlorAnimation();
+	void handleRaoulAnimation();
+	void handleEndAnimation();
+
+public:
+	Scene204(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: de343a4d41720b4514ebd2d9a37e32eb367a578a
    https://github.com/scummvm/scummvm/commit/de343a4d41720b4514ebd2d9a37e32eb367a578a
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T00:26:03+01:00

Commit Message:
MADS: Phantom: Implement scene 205

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 04f22af..64bb282 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -82,9 +82,9 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 203:	// office
 		return new Scene203(vm);
 	case 204:	// library
-		return new DummyScene(vm);	// TODO
+		return new Scene204(vm);
 	case 205:	// upper floor, outside balcony boxes
-		return new DummyScene(vm);	// TODO
+		return new Scene205(vm);
 	case 206:	// balcony box #1
 		return new DummyScene(vm);	// TODO
 	case 207:	// balcony box #2
diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index 3c20b95..10b6cd3 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -65,7 +65,9 @@ enum Verb {
 	VERB_CLIMB_UP = 0xA5,
 	VERB_WALK_ONTO = 0xA6,
 	VERB_WALK = 0xA7,
-	VERB_CLIMB = 0x120
+	VERB_ENTER = 0xEC,
+	VERB_CLIMB = 0x120,
+	VERB_WALK_DOWN_STAIRS_TO = 0x153
 };
 
 enum Noun {
@@ -274,7 +276,6 @@ enum Noun {
 	NOUN_DECORATIVE_VASE = 0xE9,
 	NOUN_MARBLE_COLUMN = 0xEA,
 	NOUN_BOX_FIVE = 0xEB,
-	NOUN_ENTER = 0xEC,
 	NOUN_BOX_SIX = 0xED,
 	NOUN_BOX_SEVEN = 0xEE,
 	NOUN_BOX_EIGHT = 0xEF,
@@ -376,7 +377,6 @@ enum Noun {
 	NOUN_BOX_TEN = 0x150,
 	NOUN_FOYER = 0x151,
 	NOUN_WALK_DOWN_STAIRCASE = 0x152,
-	NOUN_WALK_DOWN_STAIRS_TO = 0x153,
 	NOUN_HAT_RACK = 0x154,
 	NOUN_VASE = 0x155,
 	NOUN_CLOTHES_DUMMY = 0x156,
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 22344d3..5386cf8 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -4203,5 +4203,1647 @@ void Scene204::handleEndAnimation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene205::Scene205(MADSEngine *vm) : Scene2xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_noConversationHold = false;
+	_giveTicketFl = false;
+
+	_richardFrame = -1;
+	_richardStatus = -1;
+	_richardCount = -1;
+	_giryFrame = -1;
+	_giryStatus = -1;
+	_giryCount = -1;
+	_conversationCounter = -1;
+	_lastRandom = -1;
+}
+
+void Scene205::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_noConversationHold);
+	s.syncAsByte(_giveTicketFl);
+
+	s.syncAsSint16LE(_richardFrame);
+	s.syncAsSint16LE(_richardStatus);
+	s.syncAsSint16LE(_richardCount);
+	s.syncAsSint16LE(_giryFrame);
+	s.syncAsSint16LE(_giryStatus);
+	s.syncAsSint16LE(_giryCount);
+	s.syncAsSint16LE(_conversationCounter);
+	s.syncAsSint16LE(_lastRandom);
+}
+
+void Scene205::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if (_globals[kCurrentYear] != 1881)
+		return;
+
+	if (_globals[kJacquesStatus] == 1)
+		_scene->_initialVariant = 3;
+	else if (_globals[kJacquesStatus] == 0) {
+		if (_globals[kMadameGiryLocation] == 0)
+			_scene->_initialVariant = 2;
+		else if (_globals[kMadameGiryLocation] == 1)
+			_scene->_initialVariant = 1;
+	}
+}
+
+void Scene205::enter() {
+	_vm->_disableFastwalk = true;
+
+	if (_globals[kJacquesStatus] != 1) {
+		_scene->_rails.disableNode(6);
+		_scene->_rails.disableNode(7);
+		_scene->_rails.disableNode(8);
+		_scene->_rails.disableNode(9);
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_lastRandom = -1;
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+	}
+
+	_conversationCounter = 0;
+	_noConversationHold = false;
+	_giveTicketFl = false;
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_9", false);
+
+	_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false);
+	_scene->_hotspots.activate(NOUN_MADAME_GIRY, false);
+	_scene->_hotspots.activate(NOUN_WOMAN, false);
+
+	_vm->_gameConv->get(18);
+	_vm->_gameConv->get(10);
+	_vm->_gameConv->get(11);
+
+	if (_globals[kCurrentYear] == 1881) {
+		if ((_globals[kMadameGiryShowsUp]) && (_globals[kJacquesStatus] == 0)) {
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('g', 1), 1);
+			_anim1ActvFl = true;
+			_giryStatus = 2;
+
+			int idx = _scene->_dynamicHotspots.add(NOUN_MADAME_GIRY, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(idx, Common::Point(75, 84), FACING_NORTHWEST);
+			_scene->setDynamicAnim(idx, _globals._animationIndexes[1], 1);
+			_scene->setDynamicAnim(idx, _globals._animationIndexes[1], 2);
+
+			switch (_globals[kMadameGiryLocation]) {
+			case 0:
+				_scene->setAnimFrame(_globals._animationIndexes[1], 138);
+				_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(62, 54));
+				_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(62, 66));
+				break;
+
+			case 1:
+				if (_globals[kMadameNameIsKnown] >= 1) {
+					_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(113, 44));
+					_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(107, 66));
+				} else
+					_scene->_hotspots.activate(NOUN_WOMAN, true);
+
+				break;
+
+			case 2:
+				_scene->setAnimFrame(_globals._animationIndexes[1], 273);
+				_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(283, 51));
+				_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(289, 62));
+				break;
+
+			default:
+				break;
+			}
+		}
+
+		if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+			if (_vm->_gameConv->_restoreRunning == 10) {
+				int count = 0;
+
+				if (_game._objects.isInInventory(OBJ_RED_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_GREEN_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_YELLOW_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_BLUE_FRAME))
+					++count;
+
+				_vm->_gameConv->run(10);
+				_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+				_vm->_gameConv->exportValue(_game._difficulty);
+
+				if (count > 2)
+					_vm->_gameConv->exportValue(1);
+				else
+					_vm->_gameConv->exportValue(0);
+
+				_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+				_noConversationHold = true;
+
+				if (_giryStatus == 4)
+					_scene->setAnimFrame(_globals._animationIndexes[1], 66);
+				else
+					_giryStatus = 2;
+			} else if (_vm->_gameConv->_restoreRunning == 11) {
+				_vm->_gameConv->run(11);
+				_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+				_vm->_gameConv->exportValue(0);
+				_vm->_gameConv->exportValue(0);
+				_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+			}
+		}
+	}
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+		if (_globals[kJacquesStatus] == 1) {
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1);
+			_anim0ActvFl = true;
+			_richardStatus = 3;
+			_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true);
+
+			if (_vm->_gameConv->_restoreRunning == 18) {
+				_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+				_richardStatus = 3;
+				_vm->_gameConv->run(18);
+				_scene->setAnimFrame(_globals._animationIndexes[0], 1);
+			}
+		}
+	}
+
+	if (_scene->_priorSceneId == 206) {
+		_game._player._playerPos = Common::Point(37, 64);
+		_game._player._facing = FACING_SOUTH;
+		_game._player.walk(Common::Point(41, 67), FACING_SOUTH);
+		_game._player.setWalkTrigger(90);
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		if (_globals[kJacquesStatus] == 1) {
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1);
+			_anim0ActvFl = true;
+			_richardStatus = 3;
+			_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true);
+		}
+	} else if (_scene->_priorSceneId == 207) {
+		_game._player._playerPos = Common::Point(263, 59);
+		_game._player._facing = FACING_SOUTH;
+		_game._player.walk(Common::Point(262, 63), FACING_SOUTH);
+		_game._player.setWalkTrigger(95);
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	} else if (_scene->_priorSceneId == 150) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1);
+		_anim0ActvFl = true;
+		_richardStatus = 3;
+		_game._player._playerPos = Common::Point(132, 112);
+		_game._player._facing = FACING_NORTHWEST;
+		_globals[kDoorsIn205] = 1;
+		_globals[kTicketPeoplePresent] = 0;
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true);
+		_vm->_gameConv->run(18);
+	} else if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		if (_globals[kJacquesStatus] == 1) {
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1);
+			_anim0ActvFl = true;
+			_richardStatus = 3;
+			_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true);
+		}
+
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+		_game._player.firstWalk(Common::Point(-20, 144), FACING_EAST, Common::Point(19, 144), FACING_NORTHEAST, true);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene205::step() {
+	if (_anim0ActvFl)
+		handleRichardAnimation();
+
+	if (_anim1ActvFl)
+		handleGiryAnimation();
+
+	if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) {
+			++_conversationCounter;
+			if (_conversationCounter > 200)
+				_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+	}
+
+	if (_giveTicketFl && !_action.isAction(VERB_GIVE)) {
+		_globals[kWalkerConverse] = 0;
+		_game._player.walk(Common::Point(_game._player._playerPos.x + 5, _game._player._playerPos.y - 10), FACING_NORTHWEST);
+		_game._player.setWalkTrigger(100);
+		_giveTicketFl = false;
+	}
+
+	switch (_game._trigger) {
+	case 100:
+		_game._player._visible = false;
+		_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], true, 5, 2);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 102);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 2, 4, 101);
+		break;
+
+	case 101:
+		_game._objects.setRoom(OBJ_TICKET, NOWHERE);
+		_giryStatus = 2;
+		break;
+
+	case 102:
+		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		_vm->_gameConv->release();
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 90:
+		_scene->deleteSequence(_globals._sequenceIndexes[0]);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 91);
+		break;
+
+	case 91:
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+		_vm->_sound->command(25);
+		_game._player._stepEnabled = true;
+		break;
+
+	case 95:
+		_scene->deleteSequence(_globals._sequenceIndexes[1]);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 96);
+		break;
+
+	case 96:
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_vm->_sound->command(25);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene205::actions() {
+	if (_vm->_gameConv->_running == 18) {
+		handleConversation18();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 10) {
+		handleConversation10();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 11) {
+		handleConversation11();
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_OPEN, NOUN_BOX_FIVE)) || (_action.isAction(VERB_ENTER, NOUN_BOX_FIVE))) {
+		if (_globals[kTicketPeoplePresent] == 2) {
+			if (_globals[kMadameGiryLocation] == 2) {
+				_vm->_gameConv->run(11);
+				_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+				_vm->_gameConv->exportValue(3);
+				_vm->_gameConv->exportValue(0);
+			} else {
+				_vm->_gameConv->run(11);
+				_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+				_vm->_gameConv->exportValue(4);
+				_vm->_gameConv->exportValue(0);
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_DOWN_STAIRS_TO, NOUN_GRAND_FOYER)) {
+		if (_globals[kTicketPeoplePresent] == 2) {
+			if (_globals[kMadameGiryLocation] == 2) {
+				_vm->_gameConv->run(11);
+				_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+				_vm->_gameConv->exportValue(1);
+				_vm->_gameConv->exportValue(0);
+			} else {
+				_vm->_gameConv->run(11);
+				_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+				_vm->_gameConv->exportValue(2);
+				_vm->_gameConv->exportValue(0);
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if ((_action.isAction(VERB_ENTER)) || (_action.isAction(VERB_OPEN)) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK)) {
+		if (((_action.isObject(NOUN_BOX_FIVE)) && ((_globals[kDoorsIn205] == 0) || (_globals[kDoorsIn205] == 2))
+			|| _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK))
+			|| ((_action.isObject(NOUN_BOX_NINE)) && ((_globals[kDoorsIn205] == 0) || (_globals[kDoorsIn205] == 1)))
+			|| (_action.isObject(NOUN_BOX_SIX)) || (_action.isObject(NOUN_BOX_SEVEN)) || (_action.isObject(NOUN_BOX_EIGHT))) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 1);
+				_action._inProgress = false;
+				return;
+
+			case 1: {
+				int idx = _globals._sequenceIndexes[2];
+				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
+				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, idx);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
+				_vm->_sound->command(72);
+				_scene->_sequences.setTimingTrigger(15, 2);
+				_action._inProgress = false;
+				return;
+				}
+
+			case 2:
+				_scene->deleteSequence(_globals._sequenceIndexes[2]);
+				_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 3);
+				_action._inProgress = false;
+				return;
+
+			case 3:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				if (_action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK))
+					_vm->_dialogs->show(20528);
+				else
+					_vm->_dialogs->show(20527);
+
+				_action._inProgress = false;
+				return;
+
+			default:
+				break;
+			}
+		} else if (((_action.isObject(NOUN_BOX_FIVE)) && ((_globals[kDoorsIn205] == 3) || (_globals[kDoorsIn205] == 1)))
+			|| ((_action.isObject(NOUN_BOX_NINE)) && ((_globals[kDoorsIn205] == 3) || (_globals[kDoorsIn205] == 2)))) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 2, 4, 80);
+				_action._inProgress = false;
+				return;
+
+			case 80:
+				_vm->_sound->command(24);
+				if (_action.isObject(NOUN_BOX_FIVE)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[0]);
+					_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 81);
+				} else if (_action.isObject(NOUN_BOX_NINE)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[1]);
+					_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 81);
+				}
+				_action._inProgress = false;
+				return;
+
+			case 81:
+				if (_action.isObject(NOUN_BOX_FIVE)) {
+					int idx = _globals._sequenceIndexes[0];
+					_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+					_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+				} else if (_action.isObject(NOUN_BOX_NINE)) {
+					int idx = _globals._sequenceIndexes[1];
+					_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2);
+					_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+				}
+				_action._inProgress = false;
+				return;
+
+			case 2:
+				_game._player._visible = true;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
+				if (_action.isObject(NOUN_BOX_FIVE)) {
+					_game._player.walk(Common::Point(37, 64), FACING_NORTH);
+					_game._player.setWalkTrigger(3);
+
+				} else if (_action.isObject(NOUN_BOX_NINE)) {
+					_game._player.walk(Common::Point(263, 59), FACING_NORTH);
+					_game._player.setWalkTrigger(3);
+				}
+				_action._inProgress = false;
+				return;
+
+			case 3:
+				if (_action.isObject(NOUN_BOX_FIVE)) {
+					_scene->_nextSceneId = 206;
+					_globals[kMadameGiryLocation] = 1;
+				} else if (_action.isObject(NOUN_BOX_NINE)) {
+					_scene->_nextSceneId = 207;
+					_globals[kMadameGiryLocation] = 1;
+				}
+				_action._inProgress = false;
+				return;
+
+			default:
+				break;
+			}
+		}
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_RICHARD)) {
+		_vm->_gameConv->run(18);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_MADAME_GIRY) || _action.isAction(VERB_TALK_TO, NOUN_WOMAN) || _action.isAction(VERB_GIVE, NOUN_TICKET, NOUN_MADAME_GIRY)) {
+		if (_globals[kTicketPeoplePresent] == 2) {
+			if ((_globals[kDoorsIn205] == 2) || (_globals[kDoorsIn205] == 3)) {
+				if (_globals[kMadameGiryLocation] == 2) {
+					_vm->_gameConv->run(11);
+					_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+					_vm->_gameConv->exportValue(1);
+
+					if (_action.isAction(VERB_GIVE))
+						_vm->_gameConv->exportValue(1);
+					else
+						_vm->_gameConv->exportValue(0);
+				} else {
+					_vm->_gameConv->run(11);
+					_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+					_vm->_gameConv->exportValue(2);
+
+					if (_action.isAction(VERB_GIVE))
+						_vm->_gameConv->exportValue(1);
+					else
+						_vm->_gameConv->exportValue(0);
+				}
+			} else {
+				_vm->_gameConv->run(11);
+				_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
+				_vm->_gameConv->exportValue(0);
+
+				if (_action.isAction(VERB_GIVE))
+					_vm->_gameConv->exportValue(1);
+				else
+					_vm->_gameConv->exportValue(0);
+			}
+		} else {
+			int count = 0;
+
+			if (_game._objects.isInInventory(OBJ_RED_FRAME))
+				++count;
+			if (_game._objects.isInInventory(OBJ_GREEN_FRAME))
+				++count;
+			if (_game._objects.isInInventory(OBJ_YELLOW_FRAME))
+				++count;
+			if (_game._objects.isInInventory(OBJ_BLUE_FRAME))
+				++count;
+
+			_vm->_gameConv->run(10);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_vm->_gameConv->exportValue(_game._difficulty);
+
+			if (count > 2)
+				_vm->_gameConv->exportValue(1);
+			else
+				_vm->_gameConv->exportValue(0);
+
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(20510);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_BOX_SIX)) {
+			_vm->_dialogs->show(20511);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOX_SEVEN)) {
+			_vm->_dialogs->show(20512);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOX_EIGHT)) {
+			_vm->_dialogs->show(20513);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOX_NINE)) {
+			if ((_globals[kDoorsIn205] == 0) || (_globals[kDoorsIn205] == 1))
+				_vm->_dialogs->show(20516);
+			else
+				_vm->_dialogs->show(20517);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOX_FIVE)) {
+			if ((_globals[kDoorsIn205] == 0) || (_globals[kDoorsIn205] == 2))
+				_vm->_dialogs->show(20514);
+			else
+				_vm->_dialogs->show(20515);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(20518);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MARBLE_COLUMN)) {
+			_vm->_dialogs->show(20519);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(20520);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(20521);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BUST)) {
+			_vm->_dialogs->show(20522);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CARPET)) {
+			_vm->_dialogs->show(20523);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GRAND_FOYER)) {
+			_vm->_dialogs->show(20524);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WOMAN) || _action.isObject(NOUN_MADAME_GIRY)) {
+			_vm->_dialogs->show(20525);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MONSIEUR_RICHARD)) {
+			_vm->_dialogs->show(20526);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_BUST)) {
+		_vm->_dialogs->show(20529);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_BOX_TEN) || _action.isAction(VERB_ENTER, NOUN_BOX_TEN) || _action.isAction(VERB_LOOK, NOUN_BOX_TEN)) {
+		_vm->_dialogs->show(20513);
+		_action._inProgress = false;
+		return;
+	}
+
+	// FIX: the original was doing a | between the two 'objects'
+	if (_action.isAction(VERB_TAKE) && (_action.isObject(NOUN_WOMAN) || _action.isObject(NOUN_MADAME_GIRY))) {
+		_vm->_dialogs->show(20530);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene205::preActions() {
+	if (_action.isObject(NOUN_BOX_FIVE) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN)))
+		_game._player.walk(Common::Point(37, 67), FACING_NORTHEAST);
+
+	if (_action.isObject(NOUN_BOX_SIX) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN)))
+		_game._player.walk(Common::Point(80, 68), FACING_NORTHEAST);
+
+	if (_action.isObject(NOUN_BOX_SEVEN) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN)))
+		_game._player.walk(Common::Point(167, 65), FACING_NORTHEAST);
+
+	if (_action.isObject(NOUN_BOX_EIGHT) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN)))
+		_game._player.walk(Common::Point(212, 64), FACING_NORTHEAST);
+
+	if (_action.isObject(NOUN_BOX_NINE) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN)))
+		_game._player.walk(Common::Point(258, 63), FACING_NORTHEAST);
+
+	if (_action.isAction(VERB_WALK_DOWN_STAIRS_TO, NOUN_GRAND_FOYER) && (_globals[kDoorsIn205] != 2) && (_globals[kDoorsIn205] != 3)) {
+		_game._player._walkOffScreenSceneId = 202;
+		_globals[kMadameGiryLocation] = 1;
+	}
+}
+
+void Scene205::handleConversation18() {
+	int interlocutorFl = false;
+	int heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 0:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_richardStatus = 0;
+		break;
+
+	case 3:
+	case 4:
+		_vm->_gameConv->setHeroTrigger(64);
+		_globals[kRanConvIn205] = true;
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 64:
+		_globals[kWalkerConverse] = 0;
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	case 62:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+		_richardStatus = 0;
+		break;
+
+	case 60:
+		_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+		_richardStatus = 3;
+		_conversationCounter = 0;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(60);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(62);
+
+	_richardCount = 0;
+}
+
+void Scene205::handleConversation10() {
+	int interlocutorFl = false;
+	int heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 9:
+		_vm->_gameConv->setInterlocutorTrigger(68);
+		interlocutorFl = true;
+		_globals[kMadameNameIsKnown] = 1;
+		_scene->_hotspots.activate(NOUN_WOMAN, false);
+		_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(113, 44));
+		_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(107, 66));
+		break;
+
+	case 10:
+		_globals[kMadameNameIsKnown] = 1;
+		_scene->_hotspots.activate(NOUN_WOMAN, false);
+		_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(113, 44));
+		_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(107, 66));
+		break;
+
+	case 7:
+		if (!_game._trigger) {
+			_giryStatus = 6;
+			_globals[kMadameNameIsKnown] = 2;
+			_globals[kMadameGiryLocation] = 0;
+			_scene->changeVariant(2);
+			_scene->_rails.disableNode(6);
+			_scene->_rails.disableNode(7);
+			_scene->_rails.disableNode(8);
+			_scene->_rails.disableNode(9);
+			_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, false, Common::Point(113, 44));
+			_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, false, Common::Point(107, 66));
+			interlocutorFl = true;
+			heroFl = true;
+			if (_globals[kDoorsIn205] == 0)
+				_globals[kDoorsIn205] = 1;
+			else if (_globals[kDoorsIn205] == 2)
+				_globals[kDoorsIn205] = 3;
+		}
+		break;
+
+	case 13:
+	case 45:
+		_vm->_gameConv->setInterlocutorTrigger(70);
+		interlocutorFl = true;
+		break;
+
+	case 21:
+		if (!_game._trigger && !_noConversationHold) {
+			_vm->_gameConv->hold();
+			_giryStatus = 4;
+		} else
+			_noConversationHold = false;
+
+		break;
+
+	case 17:
+		_vm->_gameConv->setInterlocutorTrigger(72);
+		interlocutorFl = true;
+		break;
+
+	case 11:
+		if (!_game._trigger) {
+			_vm->_gameConv->setInterlocutorTrigger(74);
+		}
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	case 23:
+	case 25:
+		if ((!_game._trigger) && (_giryStatus == 4)) {
+			_vm->_gameConv->hold();
+			_giryStatus = 0;
+		}
+		break;
+
+	case 4:
+	case 5:
+	case 8:
+	case 14:
+	case 16:
+	case 19:
+	case 40:
+	case 46:
+		_vm->_gameConv->setInterlocutorTrigger(64);
+		interlocutorFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 64:
+		switch (_action._activeAction._verbId) {
+		case 5:
+		case 14:
+		case 16:
+		case 19:
+		case 40:
+		case 46:
+			_giryStatus = 0;
+			break;
+		}
+		_globals[kWalkerConverse] = 0;
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	case 68:
+		_giryStatus = 5;
+		break;
+
+	case 74:
+		_giryStatus = 8;
+		_globals[kWalkerConverse] = 0;
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	case 72:
+		_giryStatus = 3;
+		break;
+
+	case 70:
+		if (_action._activeAction._verbId == 13) {
+			_globals[kWalkerConverse] = 0;
+			heroFl = true;
+			interlocutorFl = true;
+		}
+		_giryStatus = 1;
+		break;
+
+	case 66:
+		if (_globals[kWalkerConverse] != 0)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+
+		if ((_giryStatus != 4) && (_giryStatus != 6) && (_giryStatus != 7))
+			_giryStatus = 0;
+		break;
+
+	case 60:
+		if (_globals[kWalkerConverse] != 0)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+
+		if ((_giryStatus != 4) && (_giryStatus != 6) && (_giryStatus != 7))
+			_giryStatus = 2;
+
+		_conversationCounter = 0;
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(60);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(66);
+
+	_giryCount = 0;
+}
+
+void Scene205::handleConversation11() {
+	int interlocutorFl = false;
+	int heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 5:
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_giryStatus = 9;
+		}
+		break;
+
+	case 8:
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_giryStatus = 7;
+			_vm->_gameConv->setInterlocutorTrigger(64);
+			_game._player.walk(Common::Point(225,79), FACING_NORTHEAST);
+			interlocutorFl = true;
+			_globals[kMadameGiryLocation] = 2;
+			_scene->changeVariant(4);
+			_scene->_rails.disableNode(6);
+			_scene->_rails.disableNode(7);
+			_scene->_rails.disableNode(8);
+			_scene->_rails.disableNode(9);
+			_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, false, Common::Point(113, 44));
+			_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, false, Common::Point(107, 66));
+			if (_globals[kDoorsIn205] == 0)
+				_globals[kDoorsIn205] = 2;
+			else if (_globals[kDoorsIn205] == 1)
+				_globals[kDoorsIn205] = 3;
+		}
+		break;
+
+	case 9:
+	case 10:
+	case 12:
+	case 13:
+	case 14:
+		_vm->_gameConv->setInterlocutorTrigger(64);
+		interlocutorFl = true;
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 64:
+		switch (_action._activeAction._verbId) {
+		case 6:
+		case 10:
+		case 12:
+		case 13:
+		case 14:
+			_giryStatus = 0;
+			break;
+		}
+		_globals[kWalkerConverse] = 0;
+		heroFl = true;
+		interlocutorFl = true;
+		break;
+
+	case 110:
+		_vm->_gameConv->hold();
+		_giryStatus = 7;
+		break;
+
+	case 66:
+		if (_globals[kWalkerConverse] != 0)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
+
+		if (_giryStatus != 9)
+			_giryStatus = 0;
+		break;
+
+	case 60:
+		if (_globals[kWalkerConverse] != 0)
+			_globals[kWalkerConverse] = _vm->getRandomNumber(2, 3);
+
+		if (_giryStatus != 9)
+			_giryStatus = 2;
+
+		_conversationCounter = 0;
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(60);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(66);
+
+	_giryCount = 0;
+}
+
+void Scene205::handleRichardAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _richardFrame)
+		return;
+
+	_richardFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int random;
+	int resetFrame = -1;
+
+	switch (_richardFrame) {
+	case 1:
+	case 2:
+	case 3:
+	case 11:
+	case 19:
+	case 35:
+	case 47:
+	case 57:
+	case 69:
+		switch (_richardStatus) {
+		case 0:
+			random = _vm->getRandomNumber(1, 3);
+			++_richardCount;
+			if (_richardCount > 30) {
+				_richardStatus = 3;
+				random = 9;
+			}
+			break;
+
+		case 1:
+			random = 4;
+			_richardStatus = 0;
+			break;
+
+		case 2:
+			random = 6;
+			break;
+
+		case 4:
+			random = 5;
+			_richardStatus = 0;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(7, 50);
+			while (_lastRandom == random)
+				random = _vm->getRandomNumber(7, 50);
+
+			_lastRandom = random;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 0;
+			break;
+
+		case 2:
+			resetFrame = 1;
+			break;
+
+		case 3:
+			resetFrame = 2;
+			break;
+
+		case 4:
+			resetFrame = 11;
+			break;
+
+		case 5:
+			resetFrame = 3;
+			break;
+
+		case 6:
+			resetFrame = 57;
+			break;
+
+		case 7:
+			resetFrame = 23;
+			break;
+
+		case 8:
+			resetFrame = 19;
+			break;
+
+		case 9:
+			resetFrame = 21;
+			break;
+
+		case 10:
+			resetFrame = 25;
+			break;
+
+		case 11:
+			resetFrame = 35;
+			break;
+
+		case 12:
+			resetFrame = 47;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+
+	case 30:
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 4:
+			random = 1;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 50);
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 30;
+		else
+			resetFrame = 29;
+
+		break;
+
+	case 24:
+		switch (_richardStatus) {
+		case 1:
+		case 2:
+		case 4:
+		case 0:
+			random = 1;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 30);
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 0;
+		else
+			resetFrame = 23;
+
+		break;
+
+	case 20:
+		switch (_richardStatus) {
+		case 1:
+		case 2:
+		case 4:
+		case 0:
+			random = 1;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 50);
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 0;
+		else
+			resetFrame = 19;
+
+		break;
+
+	case 22:
+		switch (_richardStatus) {
+		case 1:
+		case 2:
+		case 4:
+		case 0:
+			random = 1;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 50);
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 0;
+		else
+			resetFrame = 21;
+
+		break;
+
+	case 41:
+		switch (_richardStatus) {
+		case 1:
+		case 2:
+		case 4:
+		case 0:
+			random = 1;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 50);
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 41;
+		else
+			resetFrame = 40;
+
+		break;
+
+	case 52:
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 4:
+			random = 1;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 50);
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 52;
+		else
+			resetFrame = 51;
+
+		break;
+
+	case 65:
+		switch (_richardStatus) {
+		case 0:
+		case 1:
+		case 2:
+		case 4:
+			random = 1;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 50);
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 65;
+		else
+			resetFrame = 64;
+
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_richardFrame = resetFrame;
+	}
+}
+
+
+void Scene205::handleGiryAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _giryFrame)
+		return;
+
+	_giryFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int random;
+	int resetFrame = -1;
+
+	switch (_giryFrame) {
+	case 77:
+		_vm->_gameConv->release();
+		break;
+
+	case 1:
+	case 2:
+	case 3:
+	case 44:
+	case 14:
+	case 21:
+	case 35:
+	case 56:
+	case 78:
+	case 284:
+		switch (_giryStatus) {
+		case 0:
+			random = _vm->getRandomNumber(1, 3);
+			++_giryCount;
+			if (_giryCount > 30) {
+				_giryStatus = 2;
+				random = 100;
+			}
+			break;
+
+		case 8:
+			random = 4;
+			_giryStatus = 0;
+			break;
+
+		case 3:
+			random = 5;
+			_giryStatus = 0;
+			break;
+
+		case 1:
+			random = 6;
+			break;
+
+		case 5:
+			_giryStatus = 0;
+			random = 7;
+			break;
+
+		case 4:
+			random = 8;
+			break;
+
+		case 6:
+			random = 9;
+			_giryStatus = 2;
+			break;
+
+		case 7:
+			random = 10;
+			_giryStatus = 2;
+			break;
+
+		case 9:
+			random = 11;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(12, 100);
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 0;
+			break;
+
+		case 2:
+			resetFrame = 1;
+			break;
+
+		case 3:
+			resetFrame = 2;
+			break;
+
+		case 4:
+			resetFrame = 3;
+			break;
+
+		case 5:
+			resetFrame = 16;
+			break;
+
+		case 6:
+			resetFrame = 21;
+			break;
+
+		case 7:
+			resetFrame = 44;
+			break;
+
+		case 8:
+			resetFrame = 56;
+			break;
+
+		case 9:
+			resetFrame = 78;
+			_vm->_gameConv->hold();
+			break;
+
+		case 10:
+			resetFrame = 140;
+			break;
+
+		case 11:
+			resetFrame = 276;
+			break;
+
+		case 12:
+			resetFrame = 35;
+			break;
+
+		default:
+			resetFrame = 0;
+			break;
+		}
+		break;
+
+	case 27:
+	case 28:
+	case 29:
+		switch (_giryStatus) {
+		case 0:
+		case 2:
+		case 3:
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+		case 8:
+		case 9:
+			random = 4;
+			break;
+
+		default:
+			random = _vm->getRandomNumber(1, 3);
+			++_giryCount;
+			if (_giryCount > 30) {
+				_giryStatus = 2;
+				random = 100;
+			}
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 26;
+			break;
+
+		case 2:
+			resetFrame = 27;
+			break;
+
+		case 3:
+			resetFrame = 28;
+			break;
+
+		default:
+			resetFrame = 29;
+			break;
+		}
+		break;
+
+	case 265:
+		_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(283, 51));
+		_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(289, 62));
+		_vm->_gameConv->release();
+		break;
+
+	case 274:
+	case 275:
+	case 276:
+		if (_giryStatus == 0) {
+			random = _vm->getRandomNumber(1, 3);
+			++_giryCount;
+			if (_giryCount > 30) {
+				_giryStatus = 2;
+				random = 100;
+			}
+		} else
+			random = 100;
+
+		switch (random) {
+		case 1:
+			resetFrame = 273;
+			break;
+
+		case 2:
+			resetFrame = 274;
+			break;
+
+		case 3:
+			resetFrame = 275;
+			break;
+
+		default:
+			resetFrame = 273;
+			break;
+		}
+		break;
+
+	case 85:
+		_vm->_gameConv->release();
+		break;
+
+	case 110:
+		_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(62, 54));
+		_scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(62, 66));
+		break;
+
+	case 138:
+	case 139:
+	case 140:
+		switch (_giryStatus) {
+		case 0:
+		case 1:
+			random = _vm->getRandomNumber(1, 3);
+			++_giryCount;
+			if (_giryCount > 30) {
+				_giryStatus = 2;
+				random = 100;
+			}
+			break;
+
+		default:
+			random = 100;
+			break;
+		}
+
+		switch (random) {
+		case 1:
+			resetFrame = 137;
+			break;
+
+		case 2:
+			resetFrame = 138;
+			break;
+
+		case 3:
+			resetFrame = 139;
+			break;
+
+		default:
+			resetFrame = 137;
+			break;
+		}
+		break;
+
+	case 66:
+		_vm->_gameConv->release();
+		break;
+
+	case 67:
+		switch (_giryStatus) {
+		case 0:
+		case 9:
+		case 2:
+		case 3:
+		case 5:
+		case 6:
+		case 7:
+		case 8:
+			random = 1;
+			break;
+
+		default:
+			random = 100;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 67;
+		else
+			resetFrame = 66;
+
+		break;
+
+	case 8:
+	case 9:
+		switch (_giryStatus) {
+		case 0:
+		case 9:
+		case 2:
+		case 3:
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+		case 8:
+			random = 1;
+			break;
+
+		default:
+			random = 100;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 9;
+		else
+			resetFrame = 8;
+
+		break;
+
+	case 280:
+		_giveTicketFl = true;
+		break;
+
+	case 281:
+		switch (_giryStatus) {
+		case 0:
+		case 2:
+		case 3:
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+		case 8:
+			random = 1;
+			break;
+
+		default:
+			random = 100;
+			break;
+		}
+
+		if (random == 1)
+			resetFrame = 281;
+		else
+			resetFrame = 280;
+
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_giryFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index 99e0e20..c373c48 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -113,10 +113,10 @@ public:
 
 class Scene203 : public Scene2xx {
 private:
-	bool _anim0ActvFl;  
-	bool _anim1ActvFl;  
-	bool _anim2ActvFl;  
-	bool _anim3ActvFl;  
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _anim3ActvFl;
 	bool _showNoteFl;
 
 	int _brieStatus;
@@ -138,7 +138,7 @@ private:
 	void handleRichardAnimation();
 	void handleRaoulAnimation();
 	void handleDaaeAnimation();
-	
+
 public:
 	Scene203(MADSEngine *vm);
 	virtual void synchronize(Common::Serializer &s);
@@ -188,6 +188,39 @@ public:
 	virtual void actions();
 };
 
+class Scene205 : public Scene2xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _noConversationHold;
+	bool _giveTicketFl;
+
+	int _richardFrame;
+	int _richardStatus;
+	int _richardCount;
+	int _giryFrame;
+	int _giryStatus;
+	int _giryCount;
+	int _conversationCounter;
+	int _lastRandom;
+
+	void handleConversation18();
+	void handleConversation10();
+	void handleConversation11();
+	void handleRichardAnimation();
+	void handleGiryAnimation();
+
+public:
+	Scene205(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 26ae514e9d6bca44b79cba6e7f5218748888b777
    https://github.com/scummvm/scummvm/commit/26ae514e9d6bca44b79cba6e7f5218748888b777
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T09:57:29+01:00

Commit Message:
MADS: Phantom: Add scene 206

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 64bb282..812ff22 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -86,7 +86,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 205:	// upper floor, outside balcony boxes
 		return new Scene205(vm);
 	case 206:	// balcony box #1
-		return new DummyScene(vm);	// TODO
+		return new Scene206(vm);
 	case 207:	// balcony box #2
 		return new DummyScene(vm);	// TODO
 	case 208:	// stage and balcony view
diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index 10b6cd3..e382407 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -66,6 +66,7 @@ enum Verb {
 	VERB_WALK_ONTO = 0xA6,
 	VERB_WALK = 0xA7,
 	VERB_ENTER = 0xEC,
+	VERB_WALK_BEHIND = 0xF3,
 	VERB_CLIMB = 0x120,
 	VERB_WALK_DOWN_STAIRS_TO = 0x153
 };
@@ -282,7 +283,6 @@ enum Noun {
 	NOUN_BOX_NINE = 0xF0,
 	NOUN_STEP = 0xF1,
 	NOUN_PANEL = 0xF2,
-	NOUN_WALK_BEHIND = 0xF3,
 	NOUN_MIDDLE_DOORWAY = 0xF4,
 	NOUN_LIGHT = 0xF5,
 	NOUN_CANDLE = 0xF6,
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 5386cf8..966836a 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -5845,5 +5845,505 @@ void Scene205::handleGiryAnimation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene206::Scene206(MADSEngine *vm) : Scene2xx(vm) {
+	_anim0ActvFl = false;
+	_skip1Fl = false;
+	_skip2Fl = false;
+}
+
+void Scene206::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_skip1Fl);
+	s.syncAsByte(_skip2Fl);
+}
+
+void Scene206::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene206::enter() {
+	_anim0ActvFl = false;
+	_skip1Fl = false;
+	_skip2Fl = false;
+
+	_scene->loadSpeech(1);
+	_vm->_gameConv->get(26);
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RDR_9", false);
+
+	if (_scene->_priorSceneId != 308) {
+		if (_globals[kPanelIn206] == 0) {
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		} else {
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
+		}
+	}
+
+	if (_globals[kPanelIn206] == 0) {
+		_scene->_hotspots.activate(NOUN_PANEL, false);
+		_scene->_hotspots.activate(NOUN_KEYHOLE, false);
+	}
+
+	if (_game._objects.isInRoom(OBJ_CRUMPLED_NOTE)) {
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 10);
+	} else
+		_scene->_hotspots.activate(NOUN_CRUMPLED_NOTE, false);
+
+	if (_globals[kTrapDoorStatus] == 0) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	}
+
+	if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('h', 1), 88);
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		_anim0ActvFl = true;
+	} else if (_scene->_priorSceneId == 308) {
+		_game._player._playerPos = Common::Point(67, 127);
+		_game._player._stepEnabled = false;
+		_game._player.walk(Common::Point(108, 137), FACING_EAST);
+		_game._player.setWalkTrigger(82);
+	} else if ((_scene->_priorSceneId == 205) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(153, 148);
+		_game._player._facing = FACING_NORTH;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene206::step() {
+	switch (_game._trigger) {
+	case 82:
+		_vm->_sound->command(24);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 83);
+		break;
+
+	case 83:
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
+		_game._player._stepEnabled = true;
+		break;
+
+	case 88:
+		_game._player._playerPos = Common::Point(168, 138);
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		_anim0ActvFl = false;
+		_game._player.resetFacing(FACING_WEST);
+		break;
+
+	default:
+		break;
+	}
+
+	if (_anim0ActvFl && !_skip1Fl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 118) {
+			_globals[kKnockedOverHead] = true;
+			_skip1Fl = true;
+			_scene->_sequences.setTimingTrigger(1, 84);
+		}
+	}
+
+	if (_anim0ActvFl && !_skip2Fl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 61) {
+			if (_vm->_sound->_preferRoland)
+				_vm->_sound->command(65);
+			else
+				_scene->playSpeech(1);
+
+			_skip2Fl = true;
+		}
+	}
+
+	switch (_game._trigger) {
+	case 84:
+		_vm->_sound->command(24);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 85);
+		break;
+
+	case 85:
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene206::actions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_LOGE_CORRIDOR)) {
+		if (_globals[kRightDoorIsOpen504]) {
+			if (_vm->_sound->_preferRoland)
+				_vm->_sound->command(65);
+			else
+				_scene->playSpeech(1);
+
+			_vm->_gameConv->run(26);
+			_vm->_gameConv->exportValue(4);
+		} else
+			_scene->_nextSceneId = 205;
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CRUMPLED_NOTE) && (_game._objects.isInRoom(OBJ_CRUMPLED_NOTE) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			_globals[kPlayerScore] += 5;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 4, 77);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 78);
+			_action._inProgress = false;
+			return;
+
+		case 77:
+			_scene->deleteSequence(_globals._sequenceIndexes[4]);
+			_scene->_hotspots.activate(NOUN_CRUMPLED_NOTE, false);
+			_game._objects.addToInventory(OBJ_CRUMPLED_NOTE);
+			_vm->_sound->command(26);
+			_action._inProgress = false;
+			return;
+
+		case 78:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 79);
+			_action._inProgress = false;
+			return;
+
+		case 79:
+			_vm->_dialogs->showItem(OBJ_CRUMPLED_NOTE, 816, 6);
+			_game._player._stepEnabled = true;
+			_action._inProgress = false;
+			return;
+
+		default:
+			break;
+		}
+	}
+
+
+	if (_action.isAction(VERB_WALK_BEHIND, NOUN_PANEL) || _action.isAction(VERB_OPEN, NOUN_PANEL)
+	 || ((_game._trigger >= 70) && (_game._trigger < 77))) {
+		if (_globals[kPanelIn206] == 3) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 7, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 3, 70);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 71);
+				break;
+
+			case 70:
+				_vm->_sound->command(24);
+				_scene->deleteSequence(_globals._sequenceIndexes[2]);
+				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+				break;
+
+			case 71:
+				_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+				_game._player._stepEnabled = true;
+				_game._player._visible = true;
+				_game._player.walk(Common::Point(67, 127), FACING_NORTHWEST);
+				_game._player.setWalkTrigger(72);
+				break;
+
+			case 72:
+				_vm->_sound->command(24);
+				_scene->deleteSequence(_globals._sequenceIndexes[3]);
+				_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 73);
+				break;
+
+			case 73:
+				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+				_scene->_nextSceneId = 308;
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 7, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 74);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 3, 75);
+				break;
+
+			case 74:
+				_game._player._stepEnabled = true;
+				_game._player._visible = true;
+				_vm->_dialogs->show(20625);
+				break;
+
+			case 75:
+				_vm->_sound->command(72);
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_UNLOCK, NOUN_PANEL) || _action.isAction(VERB_LOCK, NOUN_PANEL) || _action.isAction(VERB_PUT, NOUN_KEY, NOUN_KEYHOLE)
+	 || _action.isAction(VERB_UNLOCK, NOUN_KEYHOLE) || _action.isAction(VERB_LOCK, NOUN_KEYHOLE) || (_game._trigger >= 64)) {
+		if (_globals[kPanelIn206] >= 1) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], true, 7, 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 64);
+				break;
+
+			case 64: {
+				_vm->_sound->command(71);
+				int idx = _globals._sequenceIndexes[5];
+				_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], true, -2);
+				_game.syncTimers(1, _globals._sequenceIndexes[5], 1, idx);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], false);
+				_scene->_sequences.setTimingTrigger(30, 65);
+				}
+				break;
+
+			case 65:
+				_scene->deleteSequence(_globals._sequenceIndexes[5]);
+				_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], true, 7, 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], false);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 66);
+				break;
+
+			case 66:
+				if (_action.isAction(VERB_LOCK)) {
+					_globals[kPanelIn206] = 2;
+					_vm->_dialogs->show(20629);
+				} else if (_action.isAction(VERB_UNLOCK)) {
+					_globals[kPanelIn206] = 3;
+					_vm->_dialogs->show(20628);
+				}
+
+				if (_action.isAction(VERB_PUT)) {
+					if (_globals[kPanelIn206] <= 2) {
+						_globals[kPanelIn206] = 3;
+						_vm->_dialogs->show(20628);
+					} else {
+						_globals[kPanelIn206] = 2;
+						_vm->_dialogs->show(20629);
+					}
+				}
+
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+				_game._player._stepEnabled = true;
+				_game._player._visible = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(20610);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(20611);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(20612);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RIGHT_COLUMN)) {
+			_vm->_dialogs->show(20614);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_KEYHOLE)) {
+			_vm->_dialogs->show(20615);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RAIL)) {
+			_vm->_dialogs->show(20616);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SEAT)) {
+			_vm->_dialogs->show(20617);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LOGE_CORRIDOR)) {
+			_vm->_dialogs->show(20618);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_STAGE)) {
+			if (_globals[kJacquesStatus])
+				_vm->_dialogs->show(20630);
+			else
+				_vm->_dialogs->show(20619);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_HOUSE)) {
+			_vm->_dialogs->show(20620);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(20621);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_HOUSE_LIGHT)) {
+			_vm->_dialogs->show(20622);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PANEL)) {
+			if (_globals[kPanelIn206] == 3)
+				_vm->_dialogs->show(20624);
+			else
+				_vm->_dialogs->show(20626);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if ((_action.isObject(NOUN_LEFT_COLUMN)) && (!_game._trigger)) {
+			if (_globals[kPanelIn206] == 0) {
+				_vm->_dialogs->show(20613);
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 95);
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+			} else
+				_vm->_dialogs->show(20623);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CRUMPLED_NOTE) && _game._objects.isInRoom(OBJ_CRUMPLED_NOTE)) {
+			_vm->_dialogs->show(20627);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	switch (_game._trigger) {
+	case 95:
+		_game._player._visible = true;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_scene->_hotspots.activate(NOUN_PANEL, true);
+		_scene->_hotspots.activate(NOUN_KEYHOLE, true);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
+		if (!(_globals[kPlayerScoreFlags] & 8)) {
+			_globals[kPlayerScoreFlags] |= 8;
+			_globals[kPlayerScore] += 5;
+		}
+		_scene->_sequences.setTimingTrigger(15, 96); /* a slight delay so anim totally ends */
+
+		_action._inProgress = false;
+		return;
+
+	case 96:
+		_game._player._stepEnabled = true;
+		_globals[kPanelIn206] = 1;
+		_vm->_dialogs->show(20623);
+		_action._inProgress = false;
+		return;
+
+	default:
+		break;
+	}
+}
+
+void Scene206::preActions() {
+	if (_action.isAction(VERB_LOOK, NOUN_LEFT_COLUMN))
+		_game._player._needToWalk = true;
+
+	if (_action.isAction(VERB_UNLOCK, NOUN_PANEL) || _action.isAction(VERB_WALK_BEHIND, NOUN_PANEL)
+	 || _action.isAction(VERB_LOCK, NOUN_PANEL) || _action.isAction(VERB_OPEN, NOUN_PANEL))
+		_game._player.walk(Common::Point(108, 137), FACING_NORTHWEST);
+
+	if (_action.isObject(NOUN_LEFT_COLUMN) && (_globals[kPanelIn206] == 0))
+		_game._player.walk(Common::Point(103, 137), FACING_NORTHWEST);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index c373c48..bdb2ce2 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -221,6 +221,23 @@ public:
 	virtual void actions();
 };
 
+class Scene206 : public Scene2xx {
+private:
+	bool _anim0ActvFl;
+	bool _skip1Fl;
+	bool _skip2Fl;
+
+public:
+	Scene206(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: f0f5bd81ee6e21f73e402f4eefdb66b950e3919d
    https://github.com/scummvm/scummvm/commit/f0f5bd81ee6e21f73e402f4eefdb66b950e3919d
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T10:37:19+01:00

Commit Message:
MADS: Phantom: Implement scene 207

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 812ff22..ede6069 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -88,7 +88,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 206:	// balcony box #1
 		return new Scene206(vm);
 	case 207:	// balcony box #2
-		return new DummyScene(vm);	// TODO
+		return new Scene207(vm);
 	case 208:	// stage and balcony view
 		return new DummyScene(vm);	// TODO
 	case 250:	// cutscene
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 966836a..4bfce03 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -1347,7 +1347,6 @@ void Scene202::handleUsherAnimation() {
 	}
 }
 
-
 void Scene202::handleDegasAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _degasFrame)
 		return;
@@ -2151,8 +2150,6 @@ void Scene203::handleBrieConversation() {
 	_raoulCount = 0;
 }
 
-
-
 void Scene203::handleRichardConversation() {
 	bool interlocutorFl = false;
 	bool heroFl = false;
@@ -2972,7 +2969,6 @@ void Scene203::handleRichardAnimation() {
 	}
 }
 
-
 void Scene203::handleRaoulAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _raoulFrame)
 		return;
@@ -3166,7 +3162,6 @@ void Scene203::handleRaoulAnimation() {
 	}
 }
 
-
 void Scene203::handleDaaeAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _daaeFrame)
 		return;
@@ -5489,7 +5484,6 @@ void Scene205::handleRichardAnimation() {
 	}
 }
 
-
 void Scene205::handleGiryAnimation() {
 	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _giryFrame)
 		return;
@@ -6052,7 +6046,6 @@ void Scene206::actions() {
 		}
 	}
 
-
 	if (_action.isAction(VERB_WALK_BEHIND, NOUN_PANEL) || _action.isAction(VERB_OPEN, NOUN_PANEL)
 	 || ((_game._trigger >= 70) && (_game._trigger < 77))) {
 		if (_globals[kPanelIn206] == 3) {
@@ -6314,7 +6307,7 @@ void Scene206::actions() {
 			_globals[kPlayerScoreFlags] |= 8;
 			_globals[kPlayerScore] += 5;
 		}
-		_scene->_sequences.setTimingTrigger(15, 96); /* a slight delay so anim totally ends */
+		_scene->_sequences.setTimingTrigger(15, 96);
 
 		_action._inProgress = false;
 		return;
@@ -6345,5 +6338,193 @@ void Scene206::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene207::Scene207(MADSEngine *vm) : Scene2xx(vm) {
+	_skip1Fl = false;
+	_anim0ActvFl = false;
+}
+
+void Scene207::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_skip1Fl);
+	s.syncAsByte(_anim0ActvFl);
+}
+
+void Scene207::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene207::enter() {
+	_scene->loadSpeech(2);
+	_skip1Fl = false;
+	_anim0ActvFl = false;
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+
+	if ((_scene->_priorSceneId == 205) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(159, 147);
+		_game._player._facing = FACING_NORTH;
+	}
+
+	sceneEntrySound();
+}
+
+void Scene207::step() {
+	if (_anim0ActvFl && !_skip1Fl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 6) {
+			if (_vm->_sound->_preferRoland)
+				_vm->_sound->command(69);
+			else
+				_scene->playSpeech(2);
+
+			_skip1Fl = true;
+		}
+	}
+}
+
+void Scene207::actions() {
+	if (_action.isAction(VERB_TAKE, NOUN_SEAT)) {
+		switch (_game._trigger) {
+		case 0:
+			_globals[kPlayerScore] += 5;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_vm->_sound->command(3);
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 7, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
+			break;
+
+		case 1:
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+			_scene->_sequences.setTimingTrigger(120, 2);
+			_scene->_sequences.setTimingTrigger(240, 3);
+			break;
+
+		case 2:
+			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 4);
+			break;
+
+		case 3:
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 1), 5);
+			_anim0ActvFl = true;
+			_scene->deleteSequence(_globals._sequenceIndexes[1]);
+			break;
+
+		case 4:
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+			break;
+
+		case 5:
+			_scene->_nextSceneId = 208;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_LOGE_CORRIDOR)) {
+		_scene->_nextSceneId = 205;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(20710);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(20711);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(20712);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LEFT_COLUMN)) {
+			_vm->_dialogs->show(20713);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RIGHT_COLUMN)) {
+			_vm->_dialogs->show(20714);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RAIL)) {
+			_vm->_dialogs->show(20715);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SEAT)) {
+			_vm->_dialogs->show(20716);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LOGE_CORRIDOR)) {
+			_vm->_dialogs->show(20717);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_STAGE)) {
+			_vm->_dialogs->show(20718);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_HOUSE)) {
+			_vm->_dialogs->show(20719);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(20720);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_HOUSE_LIGHT)) {
+			_vm->_dialogs->show(20721);
+			_action._inProgress = false;
+			return;
+		}
+	}
+}
+
+void Scene207::preActions() {
+	if (_action.isAction(VERB_TAKE, NOUN_SEAT))
+		_game._player.walk(Common::Point(139, 124), FACING_NORTH);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index bdb2ce2..08ee9a3 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -238,6 +238,21 @@ public:
 	virtual void actions();
 };
 
+class Scene207 : public Scene2xx {
+private:
+	bool _skip1Fl;
+	bool _anim0ActvFl;
+
+public:
+	Scene207(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 18683f98b07a8eaa2975752ba56e361ec8e66721
    https://github.com/scummvm/scummvm/commit/18683f98b07a8eaa2975752ba56e361ec8e66721
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T11:44:35+01:00

Commit Message:
MADS: Phantom: Implement scene 208

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index ede6069..50c9341 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -90,7 +90,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 207:	// balcony box #2
 		return new Scene207(vm);
 	case 208:	// stage and balcony view
-		return new DummyScene(vm);	// TODO
+		return new Scene208(vm);
 	case 250:	// cutscene
 		return new DummyScene(vm);	// TODO
 
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 4bfce03..b4dc8c9 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -6526,5 +6526,385 @@ void Scene207::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene208::Scene208(MADSEngine *vm) : Scene2xx(vm) {
+	_skip1Fl = false;
+	_skip2Fl = false;
+
+	_topLeftPeopleFrame = -1;
+	_topRightPeopleFrame = -1;
+	_middleLeftPeopleFrame = -1;
+	_centerPeopleFrame = -1;
+	_middleRightPeopleFrame = -1;
+	_bottomLeftPeopleFrame = -1;
+	_bottomMiddlePeopleFrame = -1;
+	_bottomRightPeopleFrame = -1;
+	_direction = -1;
+}
+
+void Scene208::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+
+	s.syncAsByte(_skip1Fl);
+	s.syncAsByte(_skip2Fl);
+
+	s.syncAsSint16LE(_topLeftPeopleFrame);
+	s.syncAsSint16LE(_topRightPeopleFrame);
+	s.syncAsSint16LE(_middleLeftPeopleFrame);
+	s.syncAsSint16LE(_centerPeopleFrame);
+	s.syncAsSint16LE(_middleRightPeopleFrame);
+	s.syncAsSint16LE(_bottomLeftPeopleFrame);
+	s.syncAsSint16LE(_bottomMiddlePeopleFrame);
+	s.syncAsSint16LE(_bottomRightPeopleFrame);
+	s.syncAsSint16LE(_direction);
+}
+
+void Scene208::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene208::enter() {
+	_scene->loadSpeech(1);
+
+	_skip1Fl = false;
+	_skip2Fl = false;
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 6), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 7), false);
+
+	_scene->_userInterface.emptyConversationList();
+	_scene->_userInterface.setup(kInputConversation);
+
+	_scene->loadSpeech(1);
+
+	_game._player._stepEnabled = false;
+	_game._player._visible = false;
+
+	_topLeftPeopleFrame = 2;
+	_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, _topLeftPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
+	_scene->_sequences.setTimingTrigger(120, 60);
+
+	_topRightPeopleFrame = 2;
+	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, _topRightPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+	_scene->_sequences.setTimingTrigger(30, 62);
+
+	_middleLeftPeopleFrame = 2;
+	_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, _middleLeftPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+	_scene->_sequences.setTimingTrigger(30, 64);
+
+	_centerPeopleFrame = 1;
+	_direction = 1;
+	_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, _centerPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+	_scene->_sequences.setTimingTrigger(300, 66);
+
+	_middleRightPeopleFrame = 3;
+	_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, _middleRightPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+	_scene->_sequences.setTimingTrigger(60, 68);
+
+	_bottomLeftPeopleFrame = 4;
+	_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, _bottomLeftPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+	_scene->_sequences.setTimingTrigger(60, 70);
+
+	_bottomMiddlePeopleFrame = 4;
+	_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, _bottomMiddlePeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+	_scene->_sequences.setTimingTrigger(30, 72);
+
+	_bottomRightPeopleFrame = 3;
+	_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, _bottomRightPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+	_scene->_sequences.setTimingTrigger(15, 74);
+
+	_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('p', 1), 80);
+
+	sceneEntrySound();
+}
+
+void Scene208::step() {
+	animateTopLeftPeople();
+	animateTopRightPeople();
+	animateMiddleLeftPeople();
+	animateCenterPeople();
+	animateMiddleRightPeople();
+	animateBottomLeftPeople();
+	animateBottomMiddlePeople();
+	animateBottomRightPeople();
+
+	if (!_skip1Fl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 49) {
+			if (_vm->_sound->_preferRoland)
+				_vm->_sound->command(65);
+			else
+				_scene->playSpeech(1);
+
+			_skip1Fl = true;
+		}
+	}
+
+	if (!_skip2Fl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 68) {
+			if (_vm->_sound->_preferRoland)
+				_vm->_sound->command(65);
+			else
+				_scene->playSpeech(1);
+
+			_skip2Fl = true;
+		}
+	}
+
+	if (_game._trigger == 80)
+		_scene->_nextSceneId = 150;
+}
+
+void Scene208::actions() {
+}
+
+void Scene208::preActions() {
+}
+
+void Scene208::animateTopLeftPeople() {
+
+	if (_game._trigger != 60)
+		return;
+
+	_scene->deleteSequence(_globals._sequenceIndexes[0]);
+
+	int triggerVal;
+	int rndVal = _vm->getRandomNumber(1, 2);
+	if (_topLeftPeopleFrame == 3)
+		triggerVal = 1;
+	else
+		triggerVal = rndVal;
+
+	if (rndVal == triggerVal) {
+		_topLeftPeopleFrame += _vm->getRandomNumber(-1, 1);
+		if (_topLeftPeopleFrame == 0)
+			_topLeftPeopleFrame = 1;
+		else if (_topLeftPeopleFrame == 4)
+			_topLeftPeopleFrame = 3;
+	}
+
+	_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, _topLeftPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
+	int delay = _vm->getRandomNumber(15, 60);
+	_scene->_sequences.setTimingTrigger(delay, 60);
+}
+
+void Scene208::animateTopRightPeople() {
+	if (_game._trigger != 62)
+		return;
+
+	_scene->deleteSequence(_globals._sequenceIndexes[1]);
+
+	int triggerVal;
+	int rndVal = _vm->getRandomNumber(1, 2);
+	if (_topRightPeopleFrame == 4)
+		triggerVal = 1;
+	else
+		triggerVal = rndVal;
+
+	if (rndVal == triggerVal) {
+		_topRightPeopleFrame += _vm->getRandomNumber(-1, 1);
+		if (_topRightPeopleFrame == 0)
+			_topRightPeopleFrame = 1;
+		else if (_topRightPeopleFrame == 5)
+			_topRightPeopleFrame = 4;
+	}
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, _topRightPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+	int delay = _vm->getRandomNumber(15, 60);
+	_scene->_sequences.setTimingTrigger(delay, 62);
+}
+
+void Scene208::animateMiddleLeftPeople() {
+	if (_game._trigger != 64)
+		return;
+
+	_scene->deleteSequence(_globals._sequenceIndexes[2]);
+	int delay = _vm->getRandomNumber(60, 120);
+
+	int triggerVal;
+	int rndVal = _vm->getRandomNumber(1, 2);
+	if (_middleLeftPeopleFrame == 2)
+		triggerVal = 1;
+	else
+		triggerVal = rndVal;
+
+	if (rndVal == triggerVal) {
+		_middleLeftPeopleFrame += _vm->getRandomNumber(-1, 1);
+		if (_middleLeftPeopleFrame == 0)
+			_middleLeftPeopleFrame = 1;
+		else if (_middleLeftPeopleFrame == 5)
+			_middleLeftPeopleFrame = 4;
+	}
+
+	if ((_centerPeopleFrame == 3) && (_middleLeftPeopleFrame < 4)) {
+		++_middleLeftPeopleFrame;
+		delay = 10;
+	}
+
+	_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, _middleLeftPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+	_scene->_sequences.setTimingTrigger(delay, 64);
+}
+
+
+void Scene208::animateCenterPeople() {
+	if (_game._trigger != 66)
+		return;
+
+	_scene->deleteSequence(_globals._sequenceIndexes[3]);
+
+	int delay;
+
+	if (_direction) {
+		++_centerPeopleFrame;
+		delay = 15;
+		if (_centerPeopleFrame == 4) {
+			delay = _vm->getRandomNumber(300, 420);
+			--_centerPeopleFrame;
+			_direction = 0;
+		}
+	} else {
+		--_centerPeopleFrame;
+		delay = 15;
+		if (_centerPeopleFrame == 0) {
+			delay = _vm->getRandomNumber(600, 900);
+			++_centerPeopleFrame;
+			_direction = 1;
+		}
+	}
+
+	_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, _centerPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+	_scene->_sequences.setTimingTrigger(delay, 66);
+}
+
+void Scene208::animateMiddleRightPeople() {
+	if (_game._trigger != 68)
+		return;
+
+	_scene->deleteSequence(_globals._sequenceIndexes[4]);
+
+	int triggerVal;
+	int rndVal = _vm->getRandomNumber(1, 2);
+	if (_middleRightPeopleFrame == 1)
+		triggerVal = 1;
+	else
+		triggerVal = rndVal;
+
+	if (rndVal == triggerVal) {
+		_middleRightPeopleFrame += _vm->getRandomNumber(-1, 1);
+		if (_middleRightPeopleFrame == 0)
+			_middleRightPeopleFrame = 1;
+		else if (_middleRightPeopleFrame == 4)
+			_middleRightPeopleFrame = 3;
+
+		if (_centerPeopleFrame == 3)
+			_middleRightPeopleFrame = 3;
+	}
+
+	_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, _middleRightPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+	int delay = _vm->getRandomNumber(15, 60);
+	_scene->_sequences.setTimingTrigger(delay, 68);
+}
+
+void Scene208::animateBottomLeftPeople() {
+	if (_game._trigger != 70)
+		return;
+
+	_scene->deleteSequence(_globals._sequenceIndexes[5]);
+
+	int triggerVal;
+	int rndVal = _vm->getRandomNumber(1, 2);
+	if (_bottomLeftPeopleFrame == 4)
+		triggerVal = 1;
+	else
+		triggerVal = rndVal;
+
+	if (rndVal == triggerVal) {
+		_bottomLeftPeopleFrame += _vm->getRandomNumber(-1, 1);
+		if (_bottomLeftPeopleFrame == 0)
+			_bottomLeftPeopleFrame = 1;
+		else if (_bottomLeftPeopleFrame == 5)
+			_bottomLeftPeopleFrame = 4;
+	}
+
+	_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, _bottomLeftPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+	int delay = _vm->getRandomNumber(15, 60);
+	_scene->_sequences.setTimingTrigger(delay, 70);
+}
+
+void Scene208::animateBottomMiddlePeople() {
+	if (_game._trigger != 72)
+		return;
+
+	_scene->deleteSequence(_globals._sequenceIndexes[6]);
+
+	int triggerVal;
+	int rndVal = _vm->getRandomNumber(1, 2);
+	if (_bottomMiddlePeopleFrame == 4)
+		triggerVal = 1;
+	else
+		triggerVal = rndVal;
+
+	if (rndVal == triggerVal) {
+		_bottomMiddlePeopleFrame += _vm->getRandomNumber(-1, 1);
+		if (_bottomMiddlePeopleFrame == 0)
+			_bottomMiddlePeopleFrame = 1;
+		else if (_bottomMiddlePeopleFrame == 5)
+			_bottomMiddlePeopleFrame = 4;
+	}
+
+	_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, _bottomMiddlePeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+	int delay = _vm->getRandomNumber(15, 60);
+	_scene->_sequences.setTimingTrigger(delay, 72);
+}
+
+void Scene208::animateBottomRightPeople() {
+	if (_game._trigger != 74)
+		return;
+
+	_scene->deleteSequence(_globals._sequenceIndexes[7]);
+
+	int triggerVal;
+	int rndVal = _vm->getRandomNumber(1, 2);
+	if ((_bottomRightPeopleFrame == 3) || (_bottomRightPeopleFrame == 1))
+		triggerVal = 1;
+	else
+		triggerVal = rndVal;
+
+	if (rndVal == triggerVal) {
+		_bottomRightPeopleFrame += _vm->getRandomNumber(-1, 1);
+		if (_bottomRightPeopleFrame == 0)
+			_bottomRightPeopleFrame = 1;
+		else if (_bottomRightPeopleFrame == 4)
+			_bottomRightPeopleFrame = 3;
+	}
+
+	_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, _bottomRightPeopleFrame);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+	int delay = _vm->getRandomNumber(15, 60);
+	_scene->_sequences.setTimingTrigger(delay, 74);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index 08ee9a3..d577668 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -253,6 +253,41 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene208 : public Scene2xx {
+private:
+	bool _skip1Fl;
+	bool _skip2Fl;
+
+	int _topLeftPeopleFrame;
+	int _topRightPeopleFrame;
+	int _middleLeftPeopleFrame;
+	int _centerPeopleFrame;
+	int _middleRightPeopleFrame;
+	int _bottomLeftPeopleFrame;
+	int _bottomMiddlePeopleFrame;
+	int _bottomRightPeopleFrame;
+	int _direction;
+
+	void animateTopLeftPeople();
+	void animateTopRightPeople();
+	void animateMiddleLeftPeople();
+	void animateCenterPeople();
+	void animateMiddleRightPeople();
+	void animateBottomLeftPeople();
+	void animateBottomMiddlePeople();
+	void animateBottomRightPeople();
+
+public:
+	Scene208(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 8aa06b4dd9f34e33a47a926695c3d67dab24073d
    https://github.com/scummvm/scummvm/commit/8aa06b4dd9f34e33a47a926695c3d67dab24073d
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T12:33:00+01:00

Commit Message:
MADS: Phantom: Implement scene 250

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 50c9341..275a03d 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -92,7 +92,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 208:	// stage and balcony view
 		return new Scene208(vm);
 	case 250:	// cutscene
-		return new DummyScene(vm);	// TODO
+		return new Scene250(vm);
 
 	// Scene group #3 (catwalks, chandelier, lake / catacombs entrance)
 	case 301:	// catwalk #1 above stage
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index b4dc8c9..6454912 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -6906,5 +6906,88 @@ void Scene208::animateBottomRightPeople() {
 
 /*------------------------------------------------------------------------*/
 
+Scene250::Scene250(MADSEngine *vm) : Scene2xx(vm) {
+}
+
+void Scene250::synchronize(Common::Serializer &s) {
+	Scene2xx::synchronize(s);
+}
+
+void Scene250::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene250::enter() {
+	warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y");
+
+	_game._player._stepEnabled = false;
+	_game._player._visible    = false;
+
+	_game.loadQuoteSet(0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0);
+	_globals._animationIndexes[0] = _scene->loadAnimation("*RM150Q1", 1);
+}
+
+void Scene250::step() {
+	if (_game._trigger == 1)
+		_scene->_sequences.setTimingTrigger(12, 2);
+
+	if (_game._trigger == 2) {
+		int y = 68;
+
+		_scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 0, 900, _game.getQuote(0x36));
+		y += 16;
+
+		if (_globals[kPlayerScore] > 250)
+			_globals[kPlayerScore] = 250;
+
+		Common::String message = Common::String::format("%d", _globals[kPlayerScore]);
+		message += " ";
+		message += _game.getQuote(0x37);
+		message += " 250 ";
+		message += _game.getQuote(0x38);
+
+		_scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 3, 900, message);
+		y += 16;
+
+		_scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 0, 900, _game.getQuote(0x39));
+		y += 16;
+
+		int score = _globals[kPlayerScore];
+		int messageId;
+
+		if (score <= 25)
+			messageId = 0x3A;    /* Stage sweeper */
+		else if (score <= 50)
+			messageId = 0x3B;    /* Dresser */
+		else if (score <= 75)
+			messageId = 0x3C;    /* Usher */
+		else if (score <= 100)
+			messageId = 0x3D;    /* Stagehand */
+		else if (score <= 150)
+			messageId = 0x3E;    /* Chorus Member */
+		else if (score <= 200)
+			messageId = 0x3F;    /* Supporting Player */
+		else if (score <= 249)
+			messageId = 0x40;    /* Star Player */
+		else
+			messageId = 0x41;    /* Director */
+
+		_scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 0, 900, _game.getQuote(messageId));
+		_scene->_sequences.setTimingTrigger(930, 3);
+	}
+
+	if (_game._trigger == 3)
+		_game._winStatus = 1;
+}
+
+void Scene250::actions() {
+}
+
+void Scene250::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index d577668..7e86e2c 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -288,6 +288,19 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene250 : public Scene2xx {
+public:
+	Scene250(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 892565069cfec4f21bc84016bef0e4a600875c1b
    https://github.com/scummvm/scummvm/commit/892565069cfec4f21bc84016bef0e4a600875c1b
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T14:23:54+01:00

Commit Message:
MADS: Phantom: Add generic class Scene3xx

Changed paths:
  A engines/mads/phantom/phantom_scenes3.cpp
  A engines/mads/phantom/phantom_scenes3.h
    engines/mads/module.mk
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 998e09b..73be5ef 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -10,6 +10,7 @@ MODULE_OBJS := \
 	phantom/phantom_scenes.o \
 	phantom/phantom_scenes1.o \
 	phantom/phantom_scenes2.o \
+	phantom/phantom_scenes3.o \
 	nebular/dialogs_nebular.o \
 	nebular/game_nebular.o \
 	nebular/globals_nebular.o \
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 275a03d..1e20db7 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -30,6 +30,7 @@
 #include "mads/phantom/phantom_scenes.h"
 #include "mads/phantom/phantom_scenes1.h"
 #include "mads/phantom/phantom_scenes2.h"
+#include "mads/phantom/phantom_scenes3.h"
 
 namespace MADS {
 
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
new file mode 100644
index 0000000..7e777bc
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes3.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 "common/scummsys.h"
+#include "mads/mads.h"
+#include "mads/conversations.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+#include "mads/phantom/phantom_scenes3.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+void Scene3xx::setAAName() {
+	_game._aaName = Resources::formatAAName(_globals[kTempInterface]);
+	_vm->_palette->setEntry(254, 43, 47, 51);
+}
+
+void Scene3xx::sceneEntrySound() {
+	if (!_vm->_musicFlag)
+		return;
+
+	switch (_scene->_nextSceneId) {
+	case 303:
+	case 304:
+	case 305:
+	case 307:
+	case 308:
+		if (_globals[kKnockedOverHead])
+			_vm->_sound->command(33);
+		else
+			_vm->_sound->command(16);
+		break;
+
+	case 310:
+	case 320:
+	case 330:
+	case 340:
+		_vm->_sound->command(36);
+		break;
+
+	default:
+		if (_scene->_nextSceneId != 306)
+			_vm->_sound->command(16);
+		break;
+	}
+}
+
+void Scene3xx::setPlayerSpritesPrefix() {
+	_vm->_sound->command(5);
+
+	if ((_scene->_nextSceneId == 304) || (_scene->_nextSceneId == 305) || (_scene->_nextSceneId == 306) || (_scene->_nextSceneId == 310))
+		_game._player._spritesPrefix = "";
+	else {
+		Common::String oldName = _game._player._spritesPrefix;
+		if (!_game._player._forcePrefix)
+			_game._player._spritesPrefix = "RAL";
+		if (oldName != _game._player._spritesPrefix)
+			_game._player._spritesChanged = true;
+	}
+
+	_game._player._scalingVelocity = true;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Phantom
+} // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
new file mode 100644
index 0000000..cd6b636
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes3.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 MADS_PHANTOM_SCENES3_H
+#define MADS_PHANTOM_SCENES3_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+class Scene3xx : public PhantomScene {
+protected:
+	/**
+	 * Plays an appropriate sound when entering a scene
+	 */
+	void sceneEntrySound();
+
+	/**
+	 *Sets the AA file to use for the scene
+	 */
+	void setAAName();
+
+	/**
+	 * Updates the prefix used for getting player sprites for the scene
+	 */
+	void setPlayerSpritesPrefix();
+public:
+	Scene3xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
+};
+
+} // End of namespace Phantom
+} // End of namespace MADS
+
+#endif /* MADS_PHANTOM_SCENES3_H */


Commit: cb72286b3441d0a7248849371240758a61424ecb
    https://github.com/scummvm/scummvm/commit/cb72286b3441d0a7248849371240758a61424ecb
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T14:24:50+01:00

Commit Message:
MADS: Phantom: Set scaling velocity in generic classes Scene1xx and Scene2xx

Changed paths:
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/phantom/phantom_scenes2.h



diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index d1be6e0..dbf7d6d 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -50,7 +50,7 @@ protected:
 	 */
 	void setPlayerSpritesPrefix();
 public:
-	Scene1xx(MADSEngine *vm) : PhantomScene(vm) {}
+	Scene1xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
 };
 
 class Scene101 : public Scene1xx {
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index 7e86e2c..14a2848 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -50,7 +50,7 @@ protected:
 	 */
 	void setPlayerSpritesPrefix();
 public:
-	Scene2xx(MADSEngine *vm) : PhantomScene(vm) {}
+	Scene2xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
 };
 
 class Scene201 : public Scene2xx {


Commit: 49a5b194d07304361aa46fab4900a5104b097f8a
    https://github.com/scummvm/scummvm/commit/49a5b194d07304361aa46fab4900a5104b097f8a
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T14:27:54+01:00

Commit Message:
MADS: Phantom: Rewrite some comments

Changed paths:
    engines/mads/phantom/phantom_scenes2.cpp



diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 6454912..1d967a4 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -6957,21 +6957,29 @@ void Scene250::step() {
 		int messageId;
 
 		if (score <= 25)
-			messageId = 0x3A;    /* Stage sweeper */
+			// Score level: Stage sweeper
+			messageId = 0x3A;
 		else if (score <= 50)
-			messageId = 0x3B;    /* Dresser */
+			// Score level: Dresser
+			messageId = 0x3B;
 		else if (score <= 75)
-			messageId = 0x3C;    /* Usher */
+			// Score level: Usher
+			messageId = 0x3C;
 		else if (score <= 100)
-			messageId = 0x3D;    /* Stagehand */
+			// Score level: Stagehand
+			messageId = 0x3D;
 		else if (score <= 150)
-			messageId = 0x3E;    /* Chorus Member */
+			// Score level: Chorus member
+			messageId = 0x3E;
 		else if (score <= 200)
-			messageId = 0x3F;    /* Supporting Player */
+			// Score level: Supporting player
+			messageId = 0x3F;
 		else if (score <= 249)
-			messageId = 0x40;    /* Star Player */
+			// Score level: Star player
+			messageId = 0x40;
 		else
-			messageId = 0x41;    /* Director */
+			// Score level: Director
+			messageId = 0x41;
 
 		_scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 0, 900, _game.getQuote(messageId));
 		_scene->_sequences.setTimingTrigger(930, 3);


Commit: cbb302a550273a80b1826912396053d0309775c9
    https://github.com/scummvm/scummvm/commit/cbb302a550273a80b1826912396053d0309775c9
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T22:28:43+01:00

Commit Message:
MADS: Phantom: Implement scene 301

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h
    engines/mads/user_interface.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 1e20db7..ac2dda9 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -97,7 +97,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 
 	// Scene group #3 (catwalks, chandelier, lake / catacombs entrance)
 	case 301:	// catwalk #1 above stage
-		return new DummyScene(vm);	// TODO
+		return new Scene301(vm);
 	case 302:	// catwalk #2 above stage
 		return new DummyScene(vm);	// TODO
 	case 303:	// above chandelier
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 7e777bc..4c6a67b 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -84,5 +84,354 @@ void Scene3xx::setPlayerSpritesPrefix() {
 
 /*------------------------------------------------------------------------*/
 
+Scene301::Scene301(MADSEngine *vm) : Scene3xx(vm) {
+	_anim0ActvFl = false;
+	_skip1Fl = false;
+	_skip2Fl = false;
+
+	_lightingHotspotId = -1;
+	_sandbagHotspotId = -1;
+}
+
+void Scene301::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_skip1Fl);
+	s.syncAsByte(_skip2Fl);
+
+	s.syncAsSint16LE(_lightingHotspotId);
+	s.syncAsSint16LE(_sandbagHotspotId);
+}
+
+void Scene301::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene301::enter() {
+	_vm->_disableFastwalk = true;
+
+	_anim0ActvFl = false;
+	_skip2Fl = false;
+	_skip1Fl = false;
+
+	_scene->loadSpeech(6);
+
+	_scene->_hotspots.activate(NOUN_CABLE, false);
+	_scene->_hotspots.activate(NOUN_STOOL, false);
+
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', 0), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', 1), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 2), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', 3), false);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('z', 4), false);
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 5), false);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 6), false);
+
+		_lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(50, 116, 50 + 19, 116 + 10));
+		_scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(67, 129), FACING_NORTHWEST);
+		_lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(126, 118, 126 + 29, 118 + 8));
+		_scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(152, 129), FACING_NORTHWEST);
+
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+
+		_scene->_hotspots.activate(NOUN_CABLE, true);
+	} else {
+		_sandbagHotspotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(464, 114, 464 + 11, 114 + 9));
+		_scene->_dynamicHotspots.setPosition(_sandbagHotspotId, Common::Point(475, 125), FACING_NORTHWEST);
+		_scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(468, 42, 468 + 6, 42 + 13));
+		_scene->_hotspots.activate(NOUN_STOOL, true);
+		_scene->_hotspots.activate(NOUN_BIG_PROP, false);
+	}
+
+	if (_scene->_priorSceneId == 302) {
+		_game._player.firstWalk(Common::Point(-20, 132), FACING_WEST, Common::Point(19, 132), FACING_EAST, true);
+		_scene->setCamera(Common::Point(0, 0));
+	} else if ((_scene->_priorSceneId == 106) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(568, 133);
+		_game._player._facing = FACING_WEST;
+		_scene->setCamera(Common::Point(320, 0));
+	}
+
+	if (!_game._visitedScenes._sceneRevisited) {
+		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 64);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene301::step() {
+	if ((_globals[kDoneBrieConv203] == 3) && (_scene->_posAdjust.x < 320) && (_game._player._playerPos.x < 350)) {
+		_game._player.cancelCommand();
+		_game._player.walk(Common::Point(256, 130), FACING_NORTHWEST);
+		_game._player.setWalkTrigger(60);
+		_globals[kDoneBrieConv203] = 0;
+		_game._player._stepEnabled = false;
+	}
+
+	if (_game._trigger == 60) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('p', 1), 0);
+		_anim0ActvFl = true;
+		_game._player._visible = false;
+		_globals[kPlayerScore] += 10;
+		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+	}
+
+	if (_anim0ActvFl && !_skip1Fl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 50) {
+			_scene->playSpeech(6);
+			_skip1Fl = true;
+		}
+	}
+
+	if (_anim0ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 61) {
+			_scene->setAnimFrame(_globals._animationIndexes[0], 60);
+			if (!_skip2Fl) {
+				_vm->_sound->command(1);
+				_scene->_sequences.setTimingTrigger(420, 70);
+				_skip2Fl = true;
+			}
+		}
+	}
+
+	if (_game._trigger == 70) {
+		_scene->_userInterface.noInventoryAnim();
+		// CHECKME: Not sure about the next function call
+		_scene->_userInterface.refresh();
+		_scene->_nextSceneId = 104;
+	}
+
+	if (_game._trigger == 64)
+		_scene->_sequences.setTimingTrigger(60, 65);
+
+	if (_game._trigger == 65)
+		_vm->_dialogs->show(30137);
+}
+
+void Scene301::actions() {
+	if (_action.isAction(VERB_CLIMB_DOWN, NOUN_CIRCULAR_STAIRCASE)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1);
+			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			break;
+
+		case 1:
+			_scene->_nextSceneId = 106;
+			break;
+
+		default:
+			break;
+		}
+		goto handled;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(30110);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_GRID)) {
+			_vm->_dialogs->show(30111);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CATWALK)) {
+			_vm->_dialogs->show(30112);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_SIDE_WALL)) {
+			_vm->_dialogs->show(30113);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_BACK_WALL)) {
+			_vm->_dialogs->show(30114);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_SUPPORT)) {
+			_vm->_dialogs->show(30115);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_ACT_CURTAIN)) {
+			_vm->_dialogs->show(30116);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_HOUSE)) {
+			_vm->_dialogs->show(30117);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_OTHER_CATWALK)) {
+			_vm->_dialogs->show(30118);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_GRIDWORK)) {
+			_vm->_dialogs->show(30119);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_BEAM_POSITION)) {
+			_vm->_dialogs->show(30120);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_LIGHTING_INSTRUMENT)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(30121);
+			else
+				_vm->_dialogs->show(30122);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_TARP)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(30123);
+			else
+				_vm->_dialogs->show(30140);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_COUNTERWEIGHT_SYSTEM)) {
+			_vm->_dialogs->show(30124);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+			_vm->_dialogs->show(30125);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_BATTEN)) {
+			_vm->_dialogs->show(30126);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_STOOL)) {
+			_vm->_dialogs->show(30127);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_HEMP)) {
+			_vm->_dialogs->show(30128);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) {
+			_vm->_dialogs->show(30129);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CATWALK_OVER_HOUSE)) {
+			_vm->_dialogs->show(30130);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_STAIRCASE_POST)) {
+			_vm->_dialogs->show(30131);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_RAILING)) {
+			_vm->_dialogs->show(30132);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CYCLORAMA)) {
+			_vm->_dialogs->show(30133);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_BIG_PROP)) {
+			_vm->_dialogs->show(30134);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_PROSCENIUM_ARCH)) {
+			_vm->_dialogs->show(30135);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CABLE)) {
+			_vm->_dialogs->show(30136);
+			goto handled;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
+		_vm->_dialogs->show(30138);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
+		_vm->_dialogs->show(30141);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+		_vm->_dialogs->show(30139);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_TARP)) {
+		_vm->_dialogs->show(30142);
+		goto handled;
+	}
+
+	goto done;
+
+handled:
+	_action._inProgress = false;
+
+done:
+	;
+}
+
+void Scene301::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK_OVER_HOUSE))
+		_game._player._walkOffScreenSceneId = 302;
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index cd6b636..4c200e9 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -53,6 +53,26 @@ public:
 	Scene3xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
 };
 
+class Scene301 : public Scene3xx {
+private:
+  bool _anim0ActvFl;
+  bool _skip1Fl;
+  bool _skip2Fl;
+
+  int _lightingHotspotId;
+  int _sandbagHotspotId;
+
+public:
+	Scene301(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 
diff --git a/engines/mads/user_interface.h b/engines/mads/user_interface.h
index 1366aa2..60cc1f7 100644
--- a/engines/mads/user_interface.h
+++ b/engines/mads/user_interface.h
@@ -191,8 +191,6 @@ private:
 	 */
 	void writeVocab(ScrCategory category, int id);
 
-	void refresh();
-
 	void updateRect(const Common::Rect &bounds);
 public:
 	MSurface _surface;
@@ -304,6 +302,8 @@ public:
 	 * Synchronize the data
 	 */
 	void synchronize(Common::Serializer &s);
+
+	void refresh();
 };
 
 } // End of namespace MADS


Commit: b2a07f52f4b172c03c34cee650d86d199a4e8aec
    https://github.com/scummvm/scummvm/commit/b2a07f52f4b172c03c34cee650d86d199a4e8aec
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T23:29:58+01:00

Commit Message:
MADS: Phantom: Implement scene 302

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index ac2dda9..710ac0c 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -99,7 +99,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 301:	// catwalk #1 above stage
 		return new Scene301(vm);
 	case 302:	// catwalk #2 above stage
-		return new DummyScene(vm);	// TODO
+		return new Scene302(vm);
 	case 303:	// above chandelier
 		return new DummyScene(vm);	// TODO
 	case 304:	// chandelier
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 4c6a67b..92a1f7e 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -254,63 +254,75 @@ void Scene301::actions() {
 		default:
 			break;
 		}
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action._lookFlag) {
 		_vm->_dialogs->show(30110);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
 		if (_action.isObject(NOUN_GRID)) {
 			_vm->_dialogs->show(30111);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CATWALK)) {
 			_vm->_dialogs->show(30112);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_SIDE_WALL)) {
 			_vm->_dialogs->show(30113);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_BACK_WALL)) {
 			_vm->_dialogs->show(30114);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_SUPPORT)) {
 			_vm->_dialogs->show(30115);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_ACT_CURTAIN)) {
 			_vm->_dialogs->show(30116);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_HOUSE)) {
 			_vm->_dialogs->show(30117);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_OTHER_CATWALK)) {
 			_vm->_dialogs->show(30118);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_GRIDWORK)) {
 			_vm->_dialogs->show(30119);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_BEAM_POSITION)) {
 			_vm->_dialogs->show(30120);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_LIGHTING_INSTRUMENT)) {
@@ -319,7 +331,8 @@ void Scene301::actions() {
 			else
 				_vm->_dialogs->show(30122);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_TARP)) {
@@ -328,102 +341,112 @@ void Scene301::actions() {
 			else
 				_vm->_dialogs->show(30140);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_COUNTERWEIGHT_SYSTEM)) {
 			_vm->_dialogs->show(30124);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) {
 			_vm->_dialogs->show(30125);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_BATTEN)) {
 			_vm->_dialogs->show(30126);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_STOOL)) {
 			_vm->_dialogs->show(30127);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_HEMP)) {
 			_vm->_dialogs->show(30128);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) {
 			_vm->_dialogs->show(30129);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CATWALK_OVER_HOUSE)) {
 			_vm->_dialogs->show(30130);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_STAIRCASE_POST)) {
 			_vm->_dialogs->show(30131);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_RAILING)) {
 			_vm->_dialogs->show(30132);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CYCLORAMA)) {
 			_vm->_dialogs->show(30133);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_BIG_PROP)) {
 			_vm->_dialogs->show(30134);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_PROSCENIUM_ARCH)) {
 			_vm->_dialogs->show(30135);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CABLE)) {
 			_vm->_dialogs->show(30136);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 	}
 
 	if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
 		_vm->_dialogs->show(30138);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
 		_vm->_dialogs->show(30141);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_TAKE, NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) {
 		_vm->_dialogs->show(30139);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_TAKE, NOUN_TARP)) {
 		_vm->_dialogs->show(30142);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
-
-	goto done;
-
-handled:
-	_action._inProgress = false;
-
-done:
-	;
 }
 
 void Scene301::preActions() {
@@ -433,5 +456,203 @@ void Scene301::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene302::Scene302(MADSEngine *vm) : Scene3xx(vm) {
+}
+
+void Scene302::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+}
+
+void Scene302::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene302::enter() {
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
+
+	if (_game._objects.isInRoom(OBJ_BLUE_FRAME)) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	} else
+		_scene->_hotspots.activate(NOUN_BLUE_FRAME, false);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+	}
+
+	if (_scene->_priorSceneId == 303)
+		_game._player.firstWalk(Common::Point(-20, 134), FACING_WEST, Common::Point(15, 134), FACING_EAST, true);
+	else if ((_scene->_priorSceneId == 301) || (_scene->_priorSceneId != RETURNING_FROM_LOADING))
+		_game._player.firstWalk(Common::Point(340, 134), FACING_WEST, Common::Point(297, 134), FACING_WEST, true);
+
+	sceneEntrySound();
+}
+
+void Scene302::step() {
+}
+
+void Scene302::actions() {
+	if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME) && (_game._objects.isInRoom(OBJ_BLUE_FRAME) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			if (_globals[kCurrentYear] == 1881) {
+				int count = 0;
+				if (_game._objects.isInInventory(OBJ_YELLOW_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_RED_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_GREEN_FRAME))
+					++count;
+				if (count < 3)
+					_globals[kPlayerScore] += 5;
+			}
+
+			_game._player._stepEnabled = false;
+			_game._player._visible = false; 
+			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[2]);
+			_scene->_hotspots.activate(NOUN_BLUE_FRAME, false);
+			_game._objects.addToInventory(OBJ_BLUE_FRAME);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 844, 0);
+			else
+				_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(30210);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_CATWALK)) {
+			_vm->_dialogs->show(30211);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GRID)) {
+			_vm->_dialogs->show(30212);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_HEMP)) {
+			_vm->_dialogs->show(30213);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SIDE_WALL)) {
+			_vm->_dialogs->show(30214);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CATWALK)) {
+			_vm->_dialogs->show(30215);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RAILING)) {
+			_vm->_dialogs->show(30216);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BEAM_POSITION)) {
+			_vm->_dialogs->show(30217);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LIGHTING_INSTRUMENT)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(30218);
+			else
+				_vm->_dialogs->show(30219);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && _game._objects.isInRoom(OBJ_BLUE_FRAME)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(30220);
+			else
+				_vm->_dialogs->show(30221);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SUPPORT)) {
+			_vm->_dialogs->show(30222);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_OTHER_CATWALK)) {
+			_vm->_dialogs->show(30223);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
+		_vm->_dialogs->show(30224);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
+		_vm->_dialogs->show(30141);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene302::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) {
+		if (_scene->_customDest.x > 160)
+			_game._player._walkOffScreenSceneId = 301;
+		else
+			_game._player._walkOffScreenSceneId = 303;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 4c200e9..01fa36b 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -73,6 +73,17 @@ public:
 	virtual void actions();
 };
 
+class Scene302 : public Scene3xx {
+public:
+	Scene302(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: b06b0ef8722c40e193157d4594dcd4a61fde9b44
    https://github.com/scummvm/scummvm/commit/b06b0ef8722c40e193157d4594dcd4a61fde9b44
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-27T23:33:23+01:00

Commit Message:
MADS: Janitorial: Remove trailing spaces and tabs

Changed paths:
    engines/mads/nebular/game_nebular.cpp
    engines/mads/nebular/nebular_scenes3.cpp
    engines/mads/nebular/nebular_scenes5.cpp
    engines/mads/nebular/nebular_scenes6.cpp
    engines/mads/nebular/nebular_scenes8.cpp
    engines/mads/palette.h
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/player.cpp
    engines/mads/screen.cpp
    engines/mads/user_interface.cpp



diff --git a/engines/mads/nebular/game_nebular.cpp b/engines/mads/nebular/game_nebular.cpp
index e8e0a4f..578af51 100644
--- a/engines/mads/nebular/game_nebular.cpp
+++ b/engines/mads/nebular/game_nebular.cpp
@@ -350,7 +350,7 @@ void GameNebular::setSectionHandler() {
 
 void GameNebular::checkShowDialog() {
 	// Loop for showing dialogs, if any need to be shown
-	if (_vm->_dialogs->_pendingDialog && (_player._stepEnabled || _winStatus) 
+	if (_vm->_dialogs->_pendingDialog && (_player._stepEnabled || _winStatus)
 			&& !_globals[kCopyProtectFailed]) {
 		_player.releasePlayerSprites();
 
diff --git a/engines/mads/nebular/nebular_scenes3.cpp b/engines/mads/nebular/nebular_scenes3.cpp
index 717dd85..4056035 100644
--- a/engines/mads/nebular/nebular_scenes3.cpp
+++ b/engines/mads/nebular/nebular_scenes3.cpp
@@ -2655,7 +2655,7 @@ void Scene318::enter() {
 		0x1C8, 0x1C9, 0x1CA, 0x1CB, 0x1CC, 0x1CD, 0x1CE, 0x1CF, 0x1D0, 0x1D1, 0x1D2, 0x1D3,
 		0x190, 0x19D, 0);
 
-	if ((_scene->_priorSceneId == RETURNING_FROM_DIALOG) || (((_scene->_priorSceneId == 318) || 
+	if ((_scene->_priorSceneId == RETURNING_FROM_DIALOG) || (((_scene->_priorSceneId == 318) ||
 			(_scene->_priorSceneId == RETURNING_FROM_LOADING)) && (!_globals[kAfterHavoc]))) {
 		if (!_globals[kAfterHavoc]) {
 			_game._player._visible = false;
diff --git a/engines/mads/nebular/nebular_scenes5.cpp b/engines/mads/nebular/nebular_scenes5.cpp
index 092ddeb..76eccf9 100644
--- a/engines/mads/nebular/nebular_scenes5.cpp
+++ b/engines/mads/nebular/nebular_scenes5.cpp
@@ -2089,7 +2089,7 @@ void Scene511::actions() {
 		} else {
 			_vm->_dialogs->show(51130);
 		}
-	} else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) || 
+	} else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) ||
 			_action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_BOAT)) {
 		if (_globals[kBoatRaised])
 			_vm->_dialogs->show(51131);
diff --git a/engines/mads/nebular/nebular_scenes6.cpp b/engines/mads/nebular/nebular_scenes6.cpp
index 5b7dae4..4fa1f77 100644
--- a/engines/mads/nebular/nebular_scenes6.cpp
+++ b/engines/mads/nebular/nebular_scenes6.cpp
@@ -3930,7 +3930,7 @@ void Scene611::enter() {
 		0x2D9, 0x2DA, 0x2DB, 0x2DC, 0x2DD, 0x2DE, 0x2DF, 0x2E0, 0x2E1, 0x2E2, 0x2E3, 0x2E4, 0x2E5, 0x2E6,
 		0x323, 0x324, 0);
 
-	_dialog1.setup(kConvHermit1, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290, 
+	_dialog1.setup(kConvHermit1, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290,
 		0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0);
 
 	_dialog2.setup(kConvHermit2, 0x29C, 0x29D, 0x29E, 0x29F, 0);
diff --git a/engines/mads/nebular/nebular_scenes8.cpp b/engines/mads/nebular/nebular_scenes8.cpp
index 3c5cfe3..951b270 100644
--- a/engines/mads/nebular/nebular_scenes8.cpp
+++ b/engines/mads/nebular/nebular_scenes8.cpp
@@ -1606,7 +1606,7 @@ void Scene810::enter() {
 }
 
 void Scene810::step() {
-	if (_scene->_animation[0] && (_scene->_animation[0]->getCurrentFrame() == 200) 
+	if (_scene->_animation[0] && (_scene->_animation[0]->getCurrentFrame() == 200)
 			&& _moveAllowed) {
 		_scene->_sequences.addTimer(100, 70);
 		_moveAllowed = false;
diff --git a/engines/mads/palette.h b/engines/mads/palette.h
index 6c98947..1efe63b 100644
--- a/engines/mads/palette.h
+++ b/engines/mads/palette.h
@@ -316,7 +316,7 @@ public:
 
 	void refreshSceneColors();
 
-	static int closestColor(const byte *matchColor, const byte *refPalette, 
+	static int closestColor(const byte *matchColor, const byte *refPalette,
 		int paletteInc, int count);
 };
 
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 4aeed51..6b05fee 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -8632,7 +8632,7 @@ void Scene113::handleRaoulAnimation() {
 
 	if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _raoulFrame)
 		return;
-		
+
 	_raoulFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame();
 	int resetFrame = -1;
 
@@ -9233,7 +9233,7 @@ void Scene114::actions() {
 		case (0):
 			_globals[kPlayerScore] += 5;
 			_game._player._stepEnabled = false;
-			_game._player._visible = false;  
+			_game._player._visible = false;
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 6, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
@@ -9249,7 +9249,7 @@ void Scene114::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_scene->_sequences.setTimingTrigger(20, 3);
 			break;
@@ -9511,7 +9511,7 @@ void Scene150::enter() {
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 1);
 	else if (_scene->_priorSceneId == 203) {
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('f', 1), 2);
-		sceneEntrySound();  
+		sceneEntrySound();
 	} else if (_scene->_priorSceneId == 306)
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('e', 1), 4);
 	else if (_scene->_priorSceneId == 208)
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 92a1f7e..9c028d0 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -511,7 +511,7 @@ void Scene302::actions() {
 			}
 
 			_game._player._stepEnabled = false;
-			_game._player._visible = false; 
+			_game._player._visible = false;
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
@@ -527,7 +527,7 @@ void Scene302::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); 
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_scene->_sequences.setTimingTrigger(20, 3);
 			break;
diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index 638cc69..292f538 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -83,7 +83,7 @@ Player::Player(MADSEngine *vm)
 	_commandsAllowed = false;
 	_enableAtTarget = false;
 	_walkTrigger = 0;
-	 
+
 	Common::fill(&_stopWalkerList[0], &_stopWalkerList[12], 0);
 	Common::fill(&_stopWalkerTrigger[0], &_stopWalkerTrigger[12], 0);
 	Common::fill(&_spriteSetsPresent[0], &_spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT], false);
@@ -247,8 +247,8 @@ void Player::updateFrame() {
 	Scene &scene = _vm->_game->_scene;
 	assert(scene._sprites[idx] != nullptr);
 	SpriteAsset &spriteSet = *scene._sprites[idx];
-	
-	// WORKAROUND: Certain cutscenes set up player sprites that don't have any 
+
+	// WORKAROUND: Certain cutscenes set up player sprites that don't have any
 	// character info. In such cases, simply ignore player updates
 	if (!spriteSet._charInfo)
 		return;
diff --git a/engines/mads/screen.cpp b/engines/mads/screen.cpp
index 3c27001..c9f5df8 100644
--- a/engines/mads/screen.cpp
+++ b/engines/mads/screen.cpp
@@ -732,7 +732,7 @@ void ScreenSurface::panTransition(MSurface &newScreen, byte *palData, int entryS
 					srcPos.x + xAt + 1, srcPos.y + size.y));
 			} else {
 				newScreen.copyRectToSurface(*this, xAt, destPos.y,
-					Common::Rect(srcPos.x + xAt, srcPos.y, 
+					Common::Rect(srcPos.x + xAt, srcPos.y,
 					srcPos.x + xAt + 1, srcPos.y + size.y));
 			}
 
@@ -778,8 +778,8 @@ void ScreenSurface::swapForeground(byte newPalette[PALETTE_SIZE], byte *paletteM
 
 	Common::Rect oldClip = _clipBounds;
 	resetClipBounds();
-	
-	copyRectTranslate(*this, oldMap, Common::Point(0, 0), 
+
+	copyRectTranslate(*this, oldMap, Common::Point(0, 0),
 		Common::Rect(0, 0, MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT));
 	palette.setFullPalette(oldPalette);
 
@@ -789,9 +789,9 @@ void ScreenSurface::swapForeground(byte newPalette[PALETTE_SIZE], byte *paletteM
 /**
  * Translates a given palette into a mapping table.
  * Palettes consist of 128 RGB entries for the foreground and background
- * respectively, with the two interleaved together. So the start 
+ * respectively, with the two interleaved together. So the start
  */
-void ScreenSurface::swapPalette(const byte *palData, byte swapTable[PALETTE_COUNT], 
+void ScreenSurface::swapPalette(const byte *palData, byte swapTable[PALETTE_COUNT],
 		bool foreground) {
 	int start = foreground ? 1 : 0;
 	const byte *dynamicList = &palData[start * RGB_SIZE];
@@ -807,7 +807,7 @@ void ScreenSurface::swapPalette(const byte *palData, byte swapTable[PALETTE_COUN
 	// Handle the 128 palette entries for the foreground or background
 	for (int idx = 0; idx < (PALETTE_COUNT / 2); ++idx) {
 		if (start >= PALETTE_START && start <= PALETTE_END) {
-			swapTable[start] = Palette::closestColor(dynamicList, staticList, 
+			swapTable[start] = Palette::closestColor(dynamicList, staticList,
 				2 * RGB_SIZE, PALETTE_COUNT / 2) * 2 + staticStart;
 		}
 
diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp
index 62fd036..e4b09ff 100644
--- a/engines/mads/user_interface.cpp
+++ b/engines/mads/user_interface.cpp
@@ -733,7 +733,7 @@ void UserInterface::loadElements() {
 		_categoryIndexes[CAT_HOTSPOT - 1] = _vm->_game->_screenObjects.size() + 1;
 		for (int hotspotIdx = scene._hotspots.size() - 1; hotspotIdx >= 0; --hotspotIdx) {
 			Hotspot &hs = scene._hotspots[hotspotIdx];
-			ScreenObject *so = _vm->_game->_screenObjects.add(hs._bounds, SCREENMODE_VGA, 
+			ScreenObject *so = _vm->_game->_screenObjects.add(hs._bounds, SCREENMODE_VGA,
 				CAT_HOTSPOT, hotspotIdx);
 			so->_active = hs._active;
 		}


Commit: 58c94024a0ecea7702c5e5b9494793f56a40306f
    https://github.com/scummvm/scummvm/commit/58c94024a0ecea7702c5e5b9494793f56a40306f
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-28T09:53:11+01:00

Commit Message:
MADS: Phantom: Add scene 303

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h
    engines/mads/rails.cpp
    engines/mads/rails.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 710ac0c..9ffe6d7 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -101,7 +101,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 302:	// catwalk #2 above stage
 		return new Scene302(vm);
 	case 303:	// above chandelier
-		return new DummyScene(vm);	// TODO
+		return new Scene303(vm);
 	case 304:	// chandelier
 		return new DummyScene(vm);	// TODO
 	case 305:	// chandelier fight, phantom closeup
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 9c028d0..1985a37 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -654,5 +654,294 @@ void Scene302::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene303::Scene303(MADSEngine *vm) : Scene3xx(vm) {
+	_anim0ActvFl = false;
+	_hempHotspotId = -1;
+	_skipFrameCheckFl = -1;
+}
+
+void Scene303::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsSint16LE(_hempHotspotId);
+	s.syncAsSint16LE(_skipFrameCheckFl);
+}
+
+void Scene303::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_CHANDELIER_CABLE);
+	_scene->addActiveVocab(VERB_CLIMB_DOWN);
+}
+
+void Scene303::enter() {
+	_anim0ActvFl = false;
+	_skipFrameCheckFl = false;
+
+	if (_globals[kRightDoorIsOpen504])
+		_vm->_gameConv->get(26);
+
+	if (_globals[kCurrentYear] == 1993) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+	}
+
+	if ((_game._objects.isInRoom(OBJ_LARGE_NOTE)) && (_globals[kCurrentYear] == 1993)) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+	} else
+		_scene->_hotspots.activate(NOUN_LARGE_NOTE, false);
+
+	if (_globals[kCurrentYear] == 1993)
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+	else {
+		_hempHotspotId = _scene->_dynamicHotspots.add(NOUN_CHANDELIER_CABLE, VERB_CLIMB_DOWN, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(74, 92, 74 + 7, 92 + 12));
+		_scene->_dynamicHotspots.setPosition(_hempHotspotId, Common::Point(95, 107), FACING_NORTHWEST);
+		_scene->_dynamicHotspots[_hempHotspotId]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setCursor(_hempHotspotId, CURSOR_GO_DOWN);
+	}
+
+	if (_scene->_priorSceneId == 307)
+		_game._player.firstWalk(Common::Point(-20, 135), FACING_EAST, Common::Point(16, 135), FACING_EAST, true);
+	else if (_scene->_priorSceneId == 304) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 60);
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+	} else if (_scene->_priorSceneId == 305) {
+		_game._objects.addToInventory(OBJ_SWORD);
+		_game._player._playerPos = Common::Point(117, 92);
+		_game._player._facing = FACING_SOUTHWEST;
+	} else if ((_scene->_priorSceneId == 302) || (_scene->_priorSceneId != RETURNING_FROM_LOADING))
+		_game._player.firstWalk(Common::Point(340, 136), FACING_WEST, Common::Point(303, 136), FACING_WEST, true);
+
+	_scene->_rails.disableLine(5, 9);
+	_scene->_rails.disableLine(5, 12);
+	_scene->_rails.disableLine(5, 8);
+	_scene->_rails.disableLine(6, 3);
+	_scene->_rails.disableLine(6, 2);
+	_scene->_rails.disableLine(11, 3);
+	_scene->_rails.disableLine(11, 4);
+	_scene->_rails.disableLine(10, 2);
+	_scene->_rails.disableLine(4, 9);
+	_scene->_rails.disableLine(8, 0);
+
+	sceneEntrySound();
+}
+
+void Scene303::step() {
+	if (_game._trigger == 60) {
+		_game._player._playerPos = Common::Point(110, 95);
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game._player.resetFacing(FACING_SOUTHWEST);
+	}
+
+	if (_anim0ActvFl) {
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() >= 6) && !_skipFrameCheckFl) {
+			_skipFrameCheckFl = true;
+			_scene->deleteSequence(_globals._sequenceIndexes[2]);
+			_scene->_hotspots.activate(NOUN_LARGE_NOTE, false);
+			_game._objects.addToInventory(OBJ_LARGE_NOTE);
+			_vm->_sound->command(26);
+		}
+	}
+}
+
+void Scene303::actions() {
+	if ((_action.isAction(VERB_TAKE, NOUN_LARGE_NOTE) && _game._objects.isInRoom(OBJ_LARGE_NOTE)) || ((_game._trigger > 0) && _game._trigger < 3)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('n', 1), 1);
+			_anim0ActvFl = true;
+			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_globals[kPlayerScore] += 5;
+			break;
+
+		case 1:
+			_anim0ActvFl = false;
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			_scene->_sequences.setTimingTrigger(20, 2);
+			break;
+
+		case 2:
+			_vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7);
+			_game._player._stepEnabled = true;
+			break;
+		}
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_CLIMB_INTO, NOUN_HOLE) || _action.isAction(VERB_CLIMB_DOWN, NOUN_CHANDELIER_CABLE)) {
+		if (_globals[kCurrentYear] == 1881) {
+			switch (_game._trigger) {
+			case 0:
+				if (_globals[kRightDoorIsOpen504])
+					_vm->_dialogs->show(30331);
+
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 3);
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+				break;
+
+			case 3:
+				_scene->_nextSceneId = 304;
+				break;
+
+			default:
+				break;
+			}
+		} else
+			_vm->_dialogs->show(30325);
+
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) {
+		if (_globals[kRightDoorIsOpen504]) {
+			if (_vm->_sound->_preferRoland)
+				_vm->_sound->command(74);
+			else
+				_scene->playSpeech(1);
+
+			_vm->_gameConv->run(26);
+			_vm->_gameConv->exportValue(4);
+			goto handled;
+		}
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(30310);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		// CHECKME: That's illogical, the check is always false... Should be out of the big 'look' check
+		// It looks to me like an original bug
+		if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) {
+			_vm->_dialogs->show(30316);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CATWALK)) {
+			_vm->_dialogs->show(30311);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_GRID)) {
+			_vm->_dialogs->show(30312);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CHANDELIER_CABLE)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(30317);
+			else if (_globals[kRightDoorIsOpen504])
+				_vm->_dialogs->show(30330);
+			else
+				_vm->_dialogs->show(30329);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_HEMP)) {
+			_vm->_dialogs->show(30313);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_BACK_WALL)) {
+			_vm->_dialogs->show(30314);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_DUCTWORK)) {
+			_vm->_dialogs->show(30315);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CRATE)) {
+			_vm->_dialogs->show(30318);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_SUPPORT)) {
+			_vm->_dialogs->show(30319);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_PIECE_OF_WOOD)) {
+			_vm->_dialogs->show(30320);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_RAILING)) {
+			_vm->_dialogs->show(30321);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_CHANDELIER_TRAP)) {
+			_vm->_dialogs->show(30322);
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_HOLE)) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(30326);
+			else
+				_vm->_dialogs->show(30323);
+
+			goto handled;
+		}
+
+		if (_action.isObject(NOUN_LARGE_NOTE) && _game._objects.isInRoom(OBJ_LARGE_NOTE)) {
+			_vm->_dialogs->show(30324);
+			goto handled;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_TO, NOUN_HOLE)) {
+		_vm->_dialogs->show(30325);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
+		_vm->_dialogs->show(30327);
+		goto handled;
+	}
+
+	if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
+		_vm->_dialogs->show(30141);
+		goto handled;
+	}
+
+	goto done;
+
+handled:
+	_action._inProgress = false;
+
+done:
+	;
+}
+
+void Scene303::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK) && !_globals[kRightDoorIsOpen504]) {
+		if (_scene->_customDest.x > 160)
+			_game._player._walkOffScreenSceneId = 302;
+		else
+			_game._player._walkOffScreenSceneId = 307;
+	}
+
+	if (_action.isAction(VERB_CLIMB_INTO, NOUN_HOLE) || _action.isAction(VERB_CLIMB_DOWN, NOUN_CHANDELIER_CABLE))
+		_game._player.walk(Common::Point(110, 95), FACING_SOUTHWEST);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 01fa36b..705bab8 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -84,6 +84,22 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene303 : public Scene3xx {
+private:
+  bool _anim0ActvFl;  
+  int _hempHotspotId;
+  int _skipFrameCheckFl;
+public:
+	Scene303(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 
diff --git a/engines/mads/rails.cpp b/engines/mads/rails.cpp
index b69f813..0c946cf 100644
--- a/engines/mads/rails.cpp
+++ b/engines/mads/rails.cpp
@@ -278,4 +278,8 @@ void Rails::disableNode(int idx) {
 	warning("TODO: Rails::disableNode");
 }
 
+void Rails::disableLine(int from, int to) {
+	warning("TODO: Rails::disableLine");
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/rails.h b/engines/mads/rails.h
index ef09516..ea12177 100644
--- a/engines/mads/rails.h
+++ b/engines/mads/rails.h
@@ -129,6 +129,7 @@ public:
 	void synchronize(Common::Serializer &s);
 
 	void disableNode(int idx);
+	void disableLine(int from, int to);
 
 };
 


Commit: b5e787cd3517a6f0b1d02c06c5c253eb34169a91
    https://github.com/scummvm/scummvm/commit/b5e787cd3517a6f0b1d02c06c5c253eb34169a91
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-28T11:46:58+01:00

Commit Message:
MADS: Phantom: Polish scene 303, add scene 304

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 9ffe6d7..43c7930 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -103,7 +103,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 303:	// above chandelier
 		return new Scene303(vm);
 	case 304:	// chandelier
-		return new DummyScene(vm);	// TODO
+		return new Scene304(vm);
 	case 305:	// chandelier fight, phantom closeup
 		return new DummyScene(vm);	// TODO
 	case 306:	// chandelier #2
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 1985a37..078e009 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -774,7 +774,8 @@ void Scene303::actions() {
 			_game._player._stepEnabled = true;
 			break;
 		}
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_CLIMB_INTO, NOUN_HOLE) || _action.isAction(VERB_CLIMB_DOWN, NOUN_CHANDELIER_CABLE)) {
@@ -800,7 +801,8 @@ void Scene303::actions() {
 		} else
 			_vm->_dialogs->show(30325);
 
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) {
@@ -812,13 +814,15 @@ void Scene303::actions() {
 
 			_vm->_gameConv->run(26);
 			_vm->_gameConv->exportValue(4);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 	}
 
 	if (_action._lookFlag) {
 		_vm->_dialogs->show(30310);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
@@ -826,17 +830,20 @@ void Scene303::actions() {
 		// It looks to me like an original bug
 		if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) {
 			_vm->_dialogs->show(30316);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CATWALK)) {
 			_vm->_dialogs->show(30311);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_GRID)) {
 			_vm->_dialogs->show(30312);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CHANDELIER_CABLE)) {
@@ -847,47 +854,56 @@ void Scene303::actions() {
 			else
 				_vm->_dialogs->show(30329);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_HEMP)) {
 			_vm->_dialogs->show(30313);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_BACK_WALL)) {
 			_vm->_dialogs->show(30314);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_DUCTWORK)) {
 			_vm->_dialogs->show(30315);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CRATE)) {
 			_vm->_dialogs->show(30318);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_SUPPORT)) {
 			_vm->_dialogs->show(30319);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_PIECE_OF_WOOD)) {
 			_vm->_dialogs->show(30320);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_RAILING)) {
 			_vm->_dialogs->show(30321);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_CHANDELIER_TRAP)) {
 			_vm->_dialogs->show(30322);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_HOLE)) {
@@ -896,37 +912,34 @@ void Scene303::actions() {
 			else
 				_vm->_dialogs->show(30323);
 
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 
 		if (_action.isObject(NOUN_LARGE_NOTE) && _game._objects.isInRoom(OBJ_LARGE_NOTE)) {
 			_vm->_dialogs->show(30324);
-			goto handled;
+			_action._inProgress = false;
+			return;
 		}
 	}
 
 	if (_action.isAction(VERB_WALK_TO, NOUN_HOLE)) {
 		_vm->_dialogs->show(30325);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
 		_vm->_dialogs->show(30327);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
 
 	if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
 		_vm->_dialogs->show(30141);
-		goto handled;
+		_action._inProgress = false;
+		return;
 	}
-
-	goto done;
-
-handled:
-	_action._inProgress = false;
-
-done:
-	;
 }
 
 void Scene303::preActions() {
@@ -943,5 +956,451 @@ void Scene303::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene304::Scene304(MADSEngine *vm) : Scene3xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+
+	_raoulFrame = -1;
+	_raoulStatus = -1;
+	_fightFrame = -1;
+	_fightStatus = -1;
+	_fightCount = -1;
+	_phantomFrame = -1;
+	_phantomStatus = -1;
+}
+
+void Scene304::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+
+	s.syncAsSint16LE(_raoulFrame);
+	s.syncAsSint16LE(_raoulStatus);
+	s.syncAsSint16LE(_fightFrame);
+	s.syncAsSint16LE(_fightStatus);
+	s.syncAsSint16LE(_fightCount);
+	s.syncAsSint16LE(_phantomFrame);
+	s.syncAsSint16LE(_phantomStatus);
+}
+
+void Scene304::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene304::enter() {
+	_game._player._playerPos.x = 0;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+	}
+
+	if (_globals[kRightDoorIsOpen504])
+		_vm->_gameConv->get(23);
+
+	if (!_globals[kRightDoorIsOpen504]) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('n', 1), 0);
+		_anim0ActvFl = true;
+		_raoulStatus = 1;
+		_game._player._stepEnabled = false;
+	} else {
+		_scene->_userInterface.setup(kInputLimitedSentences);
+
+		if (_scene->_priorSceneId == 305) {
+			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+
+			_game._player._stepEnabled = false;
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0);
+			_anim1ActvFl = true;
+			_scene->setAnimFrame(_globals._animationIndexes[1], 138);
+
+		} else {
+
+			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0);
+			_anim1ActvFl = true;
+			_phantomStatus = 0;
+
+			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 0);
+			_anim2ActvFl = true;
+			_fightStatus = 0;
+
+			_game._player._stepEnabled = false;
+			_fightCount = 0;
+
+			_globals[kPlayerScore] += 10;
+
+			_vm->_gameConv->run(23);
+			_vm->_gameConv->hold();
+		}
+	}
+
+
+	if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && !_globals[kRightDoorIsOpen504]) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], 53);
+		_game._player._stepEnabled = true;
+	}
+
+	_game._player._visible = false;
+
+	sceneEntrySound();
+}
+
+void Scene304::step() {
+	if (_anim0ActvFl)
+		handleRaoulAnimation();
+
+	if (_anim1ActvFl)
+		handlePhantomAnimation();
+
+	if (_anim2ActvFl)
+		handleFightAnimation();
+}
+
+void Scene304::actions() {
+	if (_vm->_gameConv->_running == 23) {
+		handleConversation23();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_OPENING) || _action.isAction(VERB_CLIMB, NOUN_CHANDELIER_CABLE)) {
+		_raoulStatus = 0;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(30410);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(30411);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOME)) {
+			_vm->_dialogs->show(30412);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LATTICEWORK)) {
+			_vm->_dialogs->show(30413);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_OPENING)) {
+			_vm->_dialogs->show(30414);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHANDELIER)) {
+			_vm->_dialogs->show(30415);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHANDELIER_CABLE)) {
+			_vm->_dialogs->show(30416);
+			_action._inProgress = false;
+			return;
+		}
+	}
+}
+
+void Scene304::preActions() {
+}
+
+void Scene304::handleConversation23() {
+	switch (_action._activeAction._verbId) {
+	case 5:
+		_phantomStatus = 1;
+		_vm->_gameConv->hold();
+		break;
+
+	case 6:
+		if (_phantomStatus != 1)
+			_fightStatus = 0;
+
+		_vm->_gameConv->hold();
+		break;
+
+	case 9:
+		if (_phantomStatus != 1)
+			_fightStatus = 2;
+
+		break;
+
+	case 12:
+		_phantomStatus = 2;
+		break;
+
+	default:
+		break;
+	}
+
+	_fightCount = 0;
+}
+
+void Scene304::handleRaoulAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _raoulFrame)
+		return;
+
+	_raoulFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_raoulFrame) {
+	case 20:
+		_game._player._stepEnabled = true;
+		resetFrame = 53;
+		break;
+
+	case 53:
+		_scene->_nextSceneId = 303;
+		break;
+
+	case 54:
+	case 55:
+	case 56:
+		if (_raoulStatus == 0) {
+			resetFrame = 20;
+			_game._player._stepEnabled = false;
+		} else {
+			int random = _vm->getRandomNumber(1, 50);
+			switch (_raoulFrame) {
+			case 54:
+				if (random == 1)
+					resetFrame = 54;
+				else if (random == 2)
+					resetFrame = 55;
+				else
+					resetFrame = _raoulFrame - 1;
+
+				break;
+
+			case 55:
+				if (random == 1)
+					resetFrame = 54;
+				else if (random == 2)
+					resetFrame = 53;
+				else
+					resetFrame = _raoulFrame - 1;
+
+				break;
+
+			case 56:
+				if (random == 1)
+					resetFrame = 55;
+				else if (random == 2)
+					resetFrame = 53;
+				else
+					resetFrame = _raoulFrame - 1;
+
+				break;
+
+			default:
+				break;
+			}
+		}
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_raoulFrame = resetFrame;
+	}
+}
+
+void Scene304::handlePhantomAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _phantomFrame)
+		return;
+
+	_phantomFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_phantomFrame) {
+	 case 7:
+	 case 11:
+		 resetFrame = _vm->getRandomNumber(6, 7);
+
+		 if (_phantomStatus == 1)
+			 resetFrame = 7;
+
+		 break;
+
+	 case 9:
+	 case 15:
+		 switch (_vm->getRandomNumber(1, 3)) {
+		 case 1:
+			 resetFrame = 8;
+			 break;
+
+		 case 2:
+			 resetFrame = 9;
+			 break;
+
+		 case 3:
+			 resetFrame = 11;
+			 break;
+		 }
+
+		 if (_phantomStatus == 1)
+			 resetFrame = 11;
+
+		 break;
+
+	 case 13:
+	 case 24:
+		 switch (_vm->getRandomNumber(1, 3)) {
+		 case 1:
+			 resetFrame = 12;
+			 break;
+
+		 case 2:
+			 resetFrame = 13;
+			 break;
+
+		 case 3:
+			 resetFrame = 16;
+			 break;
+		 }
+
+		 if (_phantomStatus == 1)
+			 resetFrame = 16;
+
+		 break;
+
+	 case 20:
+		 if (_vm->getRandomNumber(1, 2) == 1)
+			 resetFrame = 19;
+		 else
+			 resetFrame = 20;
+
+		 if (_phantomStatus == 1)
+			 resetFrame = 24;
+
+		 break;
+
+	 case 25:
+		 _vm->_gameConv->release();
+		 break;
+
+	 case 47:
+		 _fightStatus = 0;
+		 break;
+
+	 case 59:
+		 if (_phantomStatus == 2)
+			 resetFrame = 59;
+		 else
+			 resetFrame = 58;
+		 break;
+
+	 case 60:
+		 _game._player._stepEnabled = false;
+		 break;
+
+	 case 80:
+		 _game._objects.setRoom(OBJ_SWORD, NOWHERE);
+		 break;
+
+	 case 137:
+		 _game._player._playerPos.x = 100;
+		 _scene->_nextSceneId = 305;
+		 break;
+
+	 case 176:
+		 _game._player._playerPos.x = 200;
+		 _scene->_nextSceneId = 305;
+		 break;
+
+	 default:
+		 break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_phantomFrame = resetFrame;
+	}
+}
+
+void Scene304::handleFightAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _fightFrame)
+		return;
+
+	_fightFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_fightFrame) {
+	case 22:
+		_vm->_gameConv->release();
+		break;
+
+	case 23:
+		if (_fightStatus != 2)
+			resetFrame = 22;
+		break;
+
+	case 25:
+	case 26:
+	case 27:
+		if (_fightStatus == 2) {
+			resetFrame = _vm->getRandomNumber(24, 26);
+			++_fightCount;
+			if (_fightCount > 17)
+				resetFrame = 24;
+		}
+		break;
+
+	case 28:
+		_fightStatus = 2;
+		break;
+
+	case 45:
+		_vm->_gameConv->release();
+		break;
+
+	case 46:
+	case 47:
+	case 48:
+		if (_fightStatus == 2) {
+			resetFrame = _vm->getRandomNumber(45, 47);
+			++_fightCount;
+			if (_fightCount > 17)
+				resetFrame = 45;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
+		_fightFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 705bab8..29fb204 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -87,9 +87,9 @@ public:
 
 class Scene303 : public Scene3xx {
 private:
-  bool _anim0ActvFl;  
-  int _hempHotspotId;
-  int _skipFrameCheckFl;
+	bool _anim0ActvFl;  
+	int _hempHotspotId;
+	int _skipFrameCheckFl;
 public:
 	Scene303(MADSEngine *vm);
 	virtual void synchronize(Common::Serializer &s);
@@ -100,6 +100,37 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene304 : public Scene3xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+
+	int _raoulFrame;
+	int _raoulStatus;
+	int _fightFrame;
+	int _fightStatus;
+	int _fightCount;
+	int _phantomFrame;
+	int _phantomStatus;
+
+	void handleConversation23();
+	void handleRaoulAnimation();
+	void handlePhantomAnimation();
+	void handleFightAnimation();
+
+public:
+	Scene304(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 0db7c488ead2eefbe029ea6bd09307fda0ba477a
    https://github.com/scummvm/scummvm/commit/0db7c488ead2eefbe029ea6bd09307fda0ba477a
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-28T12:29:46+01:00

Commit Message:
MADS: Phantom: Add scene 305

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 43c7930..43478e2 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -105,7 +105,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 304:	// chandelier
 		return new Scene304(vm);
 	case 305:	// chandelier fight, phantom closeup
-		return new DummyScene(vm);	// TODO
+		return new Scene305(vm);
 	case 306:	// chandelier #2
 		return new DummyScene(vm);	// TODO
 	case 307:	// catwalk #3 above stage
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 078e009..c82e31f 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -1402,5 +1402,130 @@ void Scene304::handleFightAnimation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene305::Scene305(MADSEngine *vm) : Scene3xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_skipFl = false;
+	_unmaskFl = false;
+
+	_unmaskFrame = -1;
+}
+
+void Scene305::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_skipFl);
+	s.syncAsByte(_unmaskFl);
+
+	s.syncAsSint16LE(_unmaskFrame);
+}
+
+void Scene305::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene305::enter() {
+	_unmaskFl = false;
+	_skipFl = false;
+	_game._player._visible = false;
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+
+	_scene->_userInterface.setup(kInputLimitedSentences);
+	_scene->loadSpeech(5);
+	_game.loadQuoteSet(0x64, 0x65, 0);
+
+	if (_game._player._playerPos.x == 100) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 60);
+		_scene->_hotspots.activate(NOUN_MASK, false);
+		_anim1ActvFl = true;
+	} else if (_game._player._playerPos.x == 200) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 0);
+		_anim0ActvFl = true;
+		_scene->_hotspots.activate(NOUN_CANE, false);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene305::step() {
+	if (_anim0ActvFl)
+		handle_animation_unmask ();
+
+	if (_anim1ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 53)
+			_game._player._stepEnabled = false;
+
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 54 && !_skipFl) {
+			_scene->playSpeech(5);
+			_skipFl = true;
+		}
+	}
+
+	if (_game._trigger == 60) {
+		_globals[kPlayerScore] -= 10;
+		_scene->_userInterface.noInventoryAnim();
+		// CHECKME: Not sure about the next function call
+		_scene->_userInterface.refresh();
+		_scene->_nextSceneId = 303;
+	}
+}
+
+void Scene305::actions() {
+	if (_action.isAction(VERB_PUSH, NOUN_CANE)) {
+		_scene->_nextSceneId = 304;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_MASK)) {
+		_unmaskFl = true;
+		_game._player._stepEnabled = false;
+		_action._inProgress = false;
+	}
+}
+
+void Scene305::preActions() {
+}
+
+void Scene305::handle_animation_unmask() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _unmaskFrame)
+		return;
+
+	_unmaskFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_unmaskFrame) {
+	case 25:
+		if (!_unmaskFl)
+			resetFrame = 0;
+
+		break;
+
+	case 60:
+		_scene->playSpeech(10);
+		_scene->_kernelMessages.add(Common::Point(176, 53), 0x1110, 0, 0, 360, _game.getQuote(0x64));
+		_scene->_kernelMessages.add(Common::Point(176, 68), 0x1110, 0, 0, 360, _game.getQuote(0x65));
+		break;
+
+	case 95:
+		_scene->_nextSceneId = 306;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_unmaskFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 29fb204..8b69900 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -131,6 +131,28 @@ public:
 	virtual void actions();
 };
 
+class Scene305 : public Scene3xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _skipFl;
+	bool _unmaskFl;
+
+	int _unmaskFrame;
+
+	void handle_animation_unmask();
+
+public:
+	Scene305(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 90e7f030c34a880ddc2000ad9fb9828abc58559a
    https://github.com/scummvm/scummvm/commit/90e7f030c34a880ddc2000ad9fb9828abc58559a
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-28T12:51:34+01:00

Commit Message:
MADS: Phantom: Implement scene 306

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 43478e2..9c95798 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -107,7 +107,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 305:	// chandelier fight, phantom closeup
 		return new Scene305(vm);
 	case 306:	// chandelier #2
-		return new DummyScene(vm);	// TODO
+		return new Scene306(vm);
 	case 307:	// catwalk #3 above stage
 		return new DummyScene(vm);	// TODO
 	case 308:	// hidden staircase behind balcony box
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index c82e31f..4193bab 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -1527,5 +1527,64 @@ void Scene305::handle_animation_unmask() {
 
 /*------------------------------------------------------------------------*/
 
+Scene306::Scene306(MADSEngine *vm) : Scene3xx(vm) {
+	_speechDoneFl = false;
+}
+
+void Scene306::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+
+	s.syncAsByte(_speechDoneFl);
+}
+
+void Scene306::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene306::enter() {
+	_scene->loadSpeech(6);
+	_speechDoneFl = false;
+
+	warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y");
+
+	_game._player._visible = false;
+	_game._player._stepEnabled = false;
+	_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a', 1), 60);
+
+	sceneEntrySound();
+}
+
+void Scene306::step() {
+	if (_game._trigger == 60) {
+		if (_vm->_sound->_preferRoland)
+			_scene->_sequences.setTimingTrigger(120, 61);
+		else
+			_scene->_sequences.setTimingTrigger(300, 61);
+	}
+
+	if (!_speechDoneFl && (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 3)) {
+		_scene->playSpeech(6);
+		_speechDoneFl = true;
+	}
+
+	if (_game._trigger == 61) {
+		_vm->_sound->command(1);
+		_vm->_sound->command(66);
+		_scene->_sequences.setTimingTrigger(120, 62);
+	}
+
+	if (_game._trigger == 62)
+		_scene->_nextSceneId = 150;
+}
+
+void Scene306::actions() {
+}
+
+void Scene306::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 8b69900..4e0d2d0 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -153,6 +153,20 @@ public:
 	virtual void actions();
 };
 
+class Scene306 : public Scene3xx {
+private:
+	bool _speechDoneFl;
+
+public:
+	Scene306(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 4552a9026c051a22de3814b33c196a02620147d5
    https://github.com/scummvm/scummvm/commit/4552a9026c051a22de3814b33c196a02620147d5
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-28T13:37:23+01:00

Commit Message:
MADS: Phantom: Implement scene 307

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 9c95798..d903547 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -109,7 +109,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 306:	// chandelier #2
 		return new Scene306(vm);
 	case 307:	// catwalk #3 above stage
-		return new DummyScene(vm);	// TODO
+		return new Scene307(vm);
 	case 308:	// hidden staircase behind balcony box
 		return new DummyScene(vm);	// TODO
 	case 309:	// lake and archway
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 4193bab..184a0e4 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -1586,5 +1586,281 @@ void Scene306::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene307::Scene307(MADSEngine *vm) : Scene3xx(vm) {
+}
+
+void Scene307::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+}
+
+void Scene307::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene307::enter() {
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9", false);
+
+	if (_globals[kRightDoorIsOpen504])
+		_scene->_hotspots.activate(NOUN_DOOR, true);
+	else
+		_scene->_hotspots.activate(NOUN_DOOR, false);
+
+	if (_game._objects.isInRoom(OBJ_GREEN_FRAME) && (_game._difficulty == DIFFICULTY_EASY)) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	} else
+		_scene->_hotspots.activate(NOUN_GREEN_FRAME, false);
+
+	if (_scene->_priorSceneId == 308) {
+		_game._player._playerPos = Common::Point(18, 134);
+		_game._player._facing = FACING_SOUTHEAST;
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
+		if (!(_globals[kPlayerScoreFlags] & 16)) {
+			_globals[kPlayerScoreFlags] |= 16;
+			_globals[kPlayerScore] += 5;
+		}
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+		_game._player.walk(Common::Point(41, 137), FACING_EAST);
+		_game._player.setWalkTrigger(60);
+	} else if ((_scene->_priorSceneId == 303) || (_scene->_priorSceneId != RETURNING_FROM_LOADING))
+		_game._player.firstWalk(Common::Point(340, 137), FACING_WEST, Common::Point(304, 137), FACING_WEST, true);
+
+	sceneEntrySound();
+}
+
+void Scene307::step() {
+	switch (_game._trigger) {
+	case 60:
+		_scene->deleteSequence(_globals._sequenceIndexes[3]);
+		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 61);
+		break;
+
+	case 61:
+		_vm->_sound->command(25);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene307::actions() {
+	if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME) && (_game._objects.isInRoom(OBJ_GREEN_FRAME) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			if (_globals[kCurrentYear] == 1881) {
+				int count = 0;
+				if (_game._objects.isInInventory(OBJ_YELLOW_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_RED_FRAME))
+					++count;
+				if (_game._objects.isInInventory(OBJ_BLUE_FRAME))
+					++count;
+
+				if (count < 3)
+					_globals[kPlayerScore] += 5;
+			}
+
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[2]);
+			_scene->_hotspots.activate(NOUN_GREEN_FRAME, false);
+			_game._objects.addToInventory(OBJ_GREEN_FRAME);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			if (_globals[kCurrentYear] == 1881)
+				_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 845, 0);
+			else
+				_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 70);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 72);
+			break;
+
+		case 70:
+			_vm->_sound->command(24);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 71);
+			break;
+
+		case 71: {
+			int idx = _globals._sequenceIndexes[3];
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
+			_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+			_scene->_sequences.setTimingTrigger(10, 73);
+			 }
+			 break;
+
+		case 72:
+			_game._player._visible = true;
+			break;
+
+		case 73:
+			_scene->_nextSceneId = 308;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(30710);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_COLUMN)) {
+			if (_globals[kRightDoorIsOpen504])
+				_vm->_dialogs->show(30725);
+			else
+				_vm->_dialogs->show(30711);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CATWALK)) {
+			_vm->_dialogs->show(30712);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GRID)) {
+			_vm->_dialogs->show(30713);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GIRDER)) {
+			_vm->_dialogs->show(30714);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GRIDWORK)) {
+			_vm->_dialogs->show(30715);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_HEMP)) {
+			_vm->_dialogs->show(30716);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BACK_WALL)) {
+			_vm->_dialogs->show(30717);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DUCTWORK)) {
+			_vm->_dialogs->show(30718);
+			_action._inProgress = false;
+			return;
+		}
+
+		if ((_action.isObject(NOUN_GREEN_FRAME)) && (_game._objects.isInRoom(OBJ_GREEN_FRAME))) {
+			if (_globals[kCurrentYear] == 1993)
+				_vm->_dialogs->show(30719);
+			else
+				_vm->_dialogs->show(30720);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ALCOVE)) {
+			_vm->_dialogs->show(30721);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RAILING)) {
+			_vm->_dialogs->show(30722);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR)) {
+			_vm->_dialogs->show(30726);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
+		_vm->_dialogs->show(30723);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
+		_vm->_dialogs->show(30141);
+		_action._inProgress = false;
+	}
+}
+
+void Scene307::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_ALCOVE))
+		_game._player._walkOffScreenSceneId = 303;
+
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+		_game._player.walk(Common::Point(28, 137), FACING_NORTHWEST);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 4e0d2d0..0c3da8e 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -167,6 +167,18 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene307 : public Scene3xx {
+public:
+	Scene307(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 49ef6339ee782dcd8af484853c4c10da1f7d05ba
    https://github.com/scummvm/scummvm/commit/49ef6339ee782dcd8af484853c4c10da1f7d05ba
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-28T15:24:23+01:00

Commit Message:
MADS: Phantom: Implement scene 308

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index d903547..35d7700 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -111,7 +111,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 307:	// catwalk #3 above stage
 		return new Scene307(vm);
 	case 308:	// hidden staircase behind balcony box
-		return new DummyScene(vm);	// TODO
+		return new Scene308(vm);
 	case 309:	// lake and archway
 		return new DummyScene(vm);	// TODO
 	case 310:	// lake
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 184a0e4..d671a27 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -1862,5 +1862,352 @@ void Scene307::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene308::Scene308(MADSEngine *vm) : Scene3xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+	_skip1Fl = false;
+	_skip2Fl = false;
+
+	_currentFloor = -1;
+}
+
+void Scene308::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_anim3ActvFl);
+	s.syncAsByte(_skip1Fl);
+	s.syncAsByte(_skip2Fl);
+
+	s.syncAsSint16LE(_currentFloor);
+}
+
+void Scene308::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene308::enter() {
+	_scene->loadSpeech(4);
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+		_anim3ActvFl = false;
+	}
+
+	_skip1Fl = false;
+	_skip2Fl = false;
+
+	_vm->_gameConv->get(26);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0), false);
+	_scene->_userInterface.setup(kInputLimitedSentences);
+	_game._player._visible = false;
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		switch (_currentFloor) {
+		case 1:
+			if (_globals[kRightDoorIsOpen504]) {
+				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 104));
+				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(161, 124));
+			} else {
+				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 127));
+			}
+			break;
+
+		case 2:
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 76));
+			break;
+
+		case 3:
+			if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) {
+				_anim0ActvFl = true;
+				_skip1Fl = true;
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 2), 2);
+				_scene->setAnimFrame(_globals._animationIndexes[0], 76);
+			} else {
+				_anim0ActvFl = true;
+				_skip1Fl = true;
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2);
+				_scene->setAnimFrame(_globals._animationIndexes[0], 96);
+			}
+			break;
+
+		default:
+			break;
+		}
+	} else if (_scene->_priorSceneId == 309) {
+		_currentFloor = 1;
+		if (_globals[kRightDoorIsOpen504]) {
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 104));
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(161, 124));
+		} else {
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 127));
+		}
+	} else if (_scene->_priorSceneId == 206) {
+		_currentFloor = 2;
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 76));
+	} else if (_scene->_priorSceneId == 307) {
+		_currentFloor = 3;
+		_anim0ActvFl = true;
+		_skip1Fl = true;
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2);
+		_scene->setAnimFrame(_globals._animationIndexes[0], 96);
+	}
+
+	if (!_game._visitedScenes._sceneRevisited) {
+		_globals[kPlayerScore] += 5;
+		_scene->_sequences.setTimingTrigger(1, 60);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene308::step() {
+	if (_game._trigger == 60)
+		_vm->_dialogs->show(30810);
+
+	if (_anim2ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 77) {
+			_scene->setAnimFrame(_globals._animationIndexes[0], 76);
+			if (!_skip1Fl) {
+				_game._player._stepEnabled = true;
+				_vm->_dialogs->show(30811);
+				_skip1Fl = true;
+			}
+		}
+	}
+
+	if (_anim0ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 97) {
+			if (_globals[kTopFloorLocked]) {
+				_scene->setAnimFrame(_globals._animationIndexes[0], 96);
+				if (!_skip1Fl) {
+					_game._player._stepEnabled = true;
+					_vm->_dialogs->show(30811);
+					_skip1Fl = true;
+				}
+			}
+		} else if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 116) {
+			_globals[kTopFloorLocked] = true;
+			_scene->_nextSceneId = 307;
+		}
+	}
+
+	if (_anim1ActvFl) {
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 51)  && _globals[kTopFloorLocked]) {
+			_scene->setAnimFrame(_globals._animationIndexes[0], 50);
+			if (!_skip1Fl) {
+				_game._player._stepEnabled = true;
+				_vm->_dialogs->show(30811);
+				_skip1Fl = true;
+			}
+		}
+	}
+}
+
+void Scene308::actions() {
+	switch (_game._trigger) {
+	case 1:
+		_scene->_nextSceneId = 206;
+		_action._inProgress = false;
+		return;
+
+	case 2:
+		_scene->_nextSceneId = 307;
+		_action._inProgress = false;
+		return;
+
+	case 3:
+		_scene->_nextSceneId = 309;
+		_action._inProgress = false;
+		return;
+
+	default:
+		break;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MIDDLE_LEVEL)) {
+		switch (_currentFloor) {
+		case 1:
+			if (_globals[kRightDoorIsOpen504]) {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 1);
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_scene->deleteSequence(_globals._sequenceIndexes[1]);
+				_game._player._stepEnabled = false;
+			} else {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1);
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_game._player._stepEnabled = false;
+			}
+			_action._inProgress = false;
+			return;
+
+		case 2:
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 1);
+			_scene->deleteSequence(_globals._sequenceIndexes[0]);
+			_game._player._stepEnabled = false;
+			_action._inProgress = false;
+			return;
+
+		case 3:
+			if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) {
+				_scene->freeAnimation(_globals._animationIndexes[0]);
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 4), 1);
+				_game._player._stepEnabled = false;
+				_anim2ActvFl = false;
+
+			} else {
+				_scene->freeAnimation(_globals._animationIndexes[0]);
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('x', 1), 1);
+				_game._player._stepEnabled = false;
+				_anim0ActvFl = false;
+				_anim1ActvFl = false;
+			}
+			_action._inProgress = false;
+			return;
+
+		default:
+			break;
+		}
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_UPPER_LEVEL)) {
+		switch (_currentFloor) {
+		case 1:
+			if (_globals[kRightDoorIsOpen504]) {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 2), 1);
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_scene->deleteSequence(_globals._sequenceIndexes[1]);
+				_game._player._stepEnabled = false;
+				_anim2ActvFl = true;
+				_currentFloor = 3;
+			} else {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2);
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_game._player._stepEnabled = false;
+				_anim0ActvFl = true;
+				_currentFloor = 3;
+			}
+			_action._inProgress = false;
+			return;
+
+		case 2:
+			if (_globals[kRightDoorIsOpen504]) {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 3), 2);
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_game._player._stepEnabled = false;
+			} else {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 3), 2);
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_game._player._stepEnabled = false;
+				_anim1ActvFl = true;
+				_currentFloor = 3;
+			}
+			_action._inProgress = false;
+			return;
+
+		case 3:
+			if (_globals[kRightDoorIsOpen504])
+				_globals[kTopFloorLocked] = false;
+			else {
+				_skip2Fl = false;
+				_skip1Fl = false;
+			}
+			_action._inProgress = false;
+			return;
+
+		default:
+			break;
+		}
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_LOWER_LEVEL)) {
+		switch (_currentFloor) {
+		case 1:
+			if (_globals[kRightDoorIsOpen504]) {
+				_vm->_gameConv->run(26);
+				_vm->_gameConv->exportValue(1);
+			} else {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 3);
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_game._player._stepEnabled = false;
+			}
+			_action._inProgress = false;
+			return;
+
+		case 2:
+			if (_globals[kRightDoorIsOpen504]) {
+				if (_vm->_sound->_preferRoland)
+					_vm->_sound->command(74);
+				else
+					_scene->playSpeech(1);
+
+				_vm->_gameConv->run(26);
+				_vm->_gameConv->exportValue(6);
+
+			} else {
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 3);
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_game._player._stepEnabled = false;
+			}
+			_action._inProgress = false;
+			return;
+
+		case 3:
+			if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) {
+				_vm->_gameConv->run(26);
+				_vm->_gameConv->exportValue(5);
+			} else if (_globals[kRightDoorIsOpen504] && _globals[kKnockedOverHead]) {
+				if (_vm->_sound->_preferRoland)
+					_vm->_sound->command(74);
+				else
+					_scene->playSpeech(1);
+
+				_vm->_gameConv->run(26);
+				_vm->_gameConv->exportValue(6);
+			} else {
+				_scene->freeAnimation(_globals._animationIndexes[0]);
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('x', 2), 3);
+				_game._player._stepEnabled = false;
+				_anim0ActvFl = false;
+				_anim1ActvFl = false;
+			}
+			_action._inProgress = false;
+			return;
+
+		default:
+			break;
+		}
+	}
+}
+
+void Scene308::preActions() {
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 0c3da8e..fdaf49e 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -179,6 +179,27 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene308 : public Scene3xx {
+private:
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _anim3ActvFl;
+	bool _skip1Fl;
+	bool _skip2Fl;
+	int _currentFloor;
+
+public:
+	Scene308(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: c21bf3cf38dd7eac0787152701f780976cf63044
    https://github.com/scummvm/scummvm/commit/c21bf3cf38dd7eac0787152701f780976cf63044
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-28T16:41:42+01:00

Commit Message:
MADS: Phantom: Implement scene 309

Changed paths:
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index d1e6041..2462ee3 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -194,6 +194,10 @@ void GamePhantom::synchronize(Common::Serializer &s, bool phase1) {
 	}
 }
 
+void GamePhantom::enterCatacombs(int val) {
+	warning("TODO: enterCatacombs");
+}
+
 } // End of namespace Phantom
 
 } // End of namespace MADS
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 8020d3e..3e223cd 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -95,6 +95,8 @@ public:
 	virtual void step();
 
 	virtual void synchronize(Common::Serializer &s, bool phase1);
+
+	void enterCatacombs(int val);
 };
 
 
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 35d7700..4043a88 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -113,7 +113,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 308:	// hidden staircase behind balcony box
 		return new Scene308(vm);
 	case 309:	// lake and archway
-		return new DummyScene(vm);	// TODO
+		return new Scene309(vm);
 	case 310:	// lake
 		return new DummyScene(vm);	// TODO
 
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index d671a27..c864605 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -2017,7 +2017,7 @@ void Scene308::step() {
 	}
 
 	if (_anim1ActvFl) {
-		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 51)  && _globals[kTopFloorLocked]) {
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 51) && _globals[kTopFloorLocked]) {
 			_scene->setAnimFrame(_globals._animationIndexes[0], 50);
 			if (!_skip1Fl) {
 				_game._player._stepEnabled = true;
@@ -2209,5 +2209,356 @@ void Scene308::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene309::Scene309(MADSEngine *vm) : Scene3xx(vm) {
+	_anim0ActvFl = false;
+
+	_boatStatus = -1;
+	_boatFrame = -1;
+	_talkCount = -1;
+}
+
+void Scene309::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+
+	s.syncAsSint16LE(_boatStatus);
+	s.syncAsSint16LE(_boatFrame);
+	s.syncAsSint16LE(_talkCount);
+}
+
+void Scene309::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if (_globals[kRightDoorIsOpen504])
+		_scene->_initialVariant = 1;
+}
+
+void Scene309::enter() {
+	_scene->_hotspots.activate(NOUN_CHRISTINE, false);
+	_scene->_hotspots.activate(NOUN_BOAT, false);
+
+	_anim0ActvFl = false;
+	_boatStatus = 1;
+	_vm->_gameConv->get(26);
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9", false);
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+
+		if (_game._visitedScenes.exists(310)) {
+			_anim0ActvFl = true;
+
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 70);
+			_scene->setAnimFrame(_globals._animationIndexes[0], 184);
+			int id = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots.setPosition(id, Common::Point(62, 146), FACING_NORTHWEST);
+			_scene->_dynamicHotspots[id]._articleNumber = PREP_ON;
+
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 10);
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 11);
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 12);
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 13);
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 14);
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 15);
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 16);
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 17);
+			_scene->setDynamicAnim(id, _globals._animationIndexes[0], 18);
+			_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+			_scene->_hotspots.activate(NOUN_BOAT, true);
+		}
+	}
+
+	if (_scene->_priorSceneId == 404) {
+		_game._player._playerPos = Common::Point(319, 136);
+		_game._player._facing = FACING_SOUTHWEST;
+		_game._player.walk(Common::Point(281, 148), FACING_SOUTHWEST);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+	} else if (_scene->_priorSceneId == 310) {
+		_game._player._playerPos = Common::Point(209, 144);
+		_game._player._facing = FACING_SOUTH;
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_anim0ActvFl = true;
+
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 70);
+		int id = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(id, Common::Point(63, 146), FACING_NORTHWEST);
+		_scene->_dynamicHotspots[id]._articleNumber = PREP_ON;
+
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 10);
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 11);
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 12);
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 13);
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 14);
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 15);
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 16);
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 17);
+		_scene->setDynamicAnim(id, _globals._animationIndexes[0], 18);
+		_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+		_scene->_hotspots.activate(NOUN_BOAT, true);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+	} else if ((_scene->_priorSceneId == 308) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(0, 121);
+		_game._player._facing = FACING_SOUTHEAST;
+		_game._player.walk(Common::Point(28, 142), FACING_SOUTHEAST);
+		_game._player.setWalkTrigger(65);
+		_game._player._stepEnabled = false;
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene309::step() {
+	if (_anim0ActvFl)
+		handleBoatAnimation ();
+
+	switch (_game._trigger) {
+	case 65:
+		_scene->deleteSequence(_globals._sequenceIndexes[0]);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 66);
+		break;
+
+	case 66:
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene309::actions() {
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY)) {
+		if (_globals[kRightDoorIsOpen504]) {
+			_vm->_gameConv->run(26);
+			_vm->_gameConv->exportValue(1);
+			_boatStatus = 0;
+			_talkCount = 0;
+		} else if (_globals[kLanternStatus] == 1)
+			_game.enterCatacombs(0);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) {
+		_vm->_gameConv->run(26);
+		_vm->_gameConv->exportValue(1);
+		_boatStatus = 0;
+		_talkCount = 0;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 4, 60);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 62);
+			break;
+
+		case 60:
+			_scene->deleteSequence(_globals._sequenceIndexes[0]);
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
+			_vm->_sound->command(24);
+			break;
+
+		case 61: {
+			int idx = _globals._sequenceIndexes[0];
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
+			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			_game._player.walk(Common::Point(0, 121), FACING_NORTHWEST);
+			_game._player.setWalkTrigger(63);
+			}
+			break;
+
+		case 62:
+			_game._player._visible = true;
+			break;
+
+		case 63:
+			if (!_globals[kRightDoorIsOpen504]) {
+				_scene->deleteSequence(_globals._sequenceIndexes[0]);
+				_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 64);
+				_vm->_sound->command(25);
+			} else
+				_scene->setAnimFrame(_globals._animationIndexes[0], 186);
+
+			break;
+
+		case 64:
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
+			_scene->_nextSceneId = 308;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(30910);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_STONE_WALL)) {
+			_vm->_dialogs->show(30911);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LAKE)) {
+			_vm->_dialogs->show(30912);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_STONE_COLUMN)) {
+			_vm->_dialogs->show(30913);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOORWAY)) {
+			_vm->_dialogs->show(30914);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_STONE_ARCHWAY)) {
+			_vm->_dialogs->show(30915);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_STONE_FLOOR)) {
+			_vm->_dialogs->show(30916);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CATACOMBS)) {
+			_vm->_dialogs->show(30917);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHRISTINE)) {
+			_vm->_dialogs->show(30919);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOAT)) {
+			_vm->_dialogs->show(30921);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT)) {
+		_vm->_dialogs->show(30920);
+		_action._inProgress = false;
+	}
+}
+
+void Scene309::preActions() {
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY) && (_globals[kLanternStatus] == 0)) {
+		_game._player._needToWalk = false;
+		_vm->_dialogs->show(30918);
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY) && _globals[kRightDoorIsOpen504])
+		_game._player.walk(Common::Point(285, 147), FACING_NORTHEAST);
+
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+		_game._player.walk(Common::Point(16, 139), FACING_NORTHEAST);
+}
+
+void Scene309::handleBoatAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _boatFrame)
+		return;
+
+	_boatFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+
+	switch (_boatFrame) {
+	case 72:
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game._player._visible = true;
+		break;
+
+	case 130:
+		_game._player._stepEnabled = true;
+		break;
+
+	case 185:
+		if (_boatStatus == 0)
+			resetFrame = 244;
+		else
+			resetFrame = 184;
+
+		break;
+
+	case 244:
+		_scene->_nextSceneId = 308;
+		break;
+
+	case 245:
+	case 246:
+	case 247:
+		resetFrame = _vm->getRandomNumber(244, 246);
+		++_talkCount;
+		if (_talkCount > 10) {
+			resetFrame = 184;
+			_boatStatus = 1;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_boatFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index fdaf49e..b6ecfe6 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -200,6 +200,27 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene309 : public Scene3xx {
+private:
+	bool _anim0ActvFl;
+
+	int _boatStatus;
+	int _boatFrame;
+	int _talkCount;
+
+	void Scene309::handleBoatAnimation();
+
+public:
+	Scene309(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 73614e9415cb005926192530cf5da1318c70c483
    https://github.com/scummvm/scummvm/commit/73614e9415cb005926192530cf5da1318c70c483
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-28T18:02:34+01:00

Commit Message:
MADS: Use uint32 for frame timer functions

Changed paths:
    engines/mads/animation.cpp
    engines/mads/animation.h



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index 0b0e28a..a36ac31 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -603,7 +603,7 @@ void Animation::setCurrentFrame(int frameNumber) {
 	_freeFlag = false;
 }
 
-void Animation::setNextFrameTimer(int frameNumber) {
+void Animation::setNextFrameTimer(uint32 frameNumber) {
 	_nextFrameTimer = frameNumber;
 }
 
diff --git a/engines/mads/animation.h b/engines/mads/animation.h
index 45e6e3c..a967eaa 100644
--- a/engines/mads/animation.h
+++ b/engines/mads/animation.h
@@ -225,8 +225,8 @@ public:
 	 */
 	void eraseSprites();
 
-	void setNextFrameTimer(int frameNumber);
-	int getNextFrameTimer() const { return _nextFrameTimer; }
+	void setNextFrameTimer(uint32 frameNumber);
+	uint32 getNextFrameTimer() const { return _nextFrameTimer; }
 	void setCurrentFrame(int frameNumber);
 	int getCurrentFrame() const { return _currentFrame; }
 


Commit: af7a233d97fca1e52df6de66c508f5c34d4484bf
    https://github.com/scummvm/scummvm/commit/af7a233d97fca1e52df6de66c508f5c34d4484bf
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-29T03:17:14+01:00

Commit Message:
MADS: Phantom: Implement scene 310

Changed paths:
    engines/mads/animation.cpp
    engines/mads/animation.h
    engines/mads/game.cpp
    engines/mads/game.h
    engines/mads/messages.cpp
    engines/mads/messages.h
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index a36ac31..5020110 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -162,6 +162,7 @@ Animation::Animation(MADSEngine *vm, Scene *scene) : _vm(vm), _scene(scene) {
 	_flags = 0;
 	_font = nullptr;
 	_resetFlag = false;
+	_canChangeView = false;
 	_messageCtr = 0;
 	_skipLoad = false;
 	_freeFlag = false;
@@ -616,4 +617,9 @@ void Animation::eraseSprites() {
 	}
 }
 
+Common::Point Animation::getFramePosAdjust(int idx) {
+	warning("TODO: Implement getFramePosAdjust");
+
+	return Common::Point(0, 0);
+}
 } // End of namespace MADS
diff --git a/engines/mads/animation.h b/engines/mads/animation.h
index a967eaa..67adeeb 100644
--- a/engines/mads/animation.h
+++ b/engines/mads/animation.h
@@ -189,6 +189,7 @@ public:
 	Common::Array<AnimUIEntry> _uiEntries;
 	Common::Array<AnimMessage> _messages;
 	bool _resetFlag;
+	bool _canChangeView;
 	int _currentFrame;
 	int _oldFrameEntry;
 	int _dynamicHotspotIndex;
@@ -236,6 +237,8 @@ public:
 	void resetSpriteSetsCount() { _header._spriteSetsCount = 0; } // CHECKME: See if it doesn't leak the memory when the destructor is called
 
 	SpriteAsset *getSpriteSet(int idx) { return _spriteSets[idx]; }
+
+	Common::Point getFramePosAdjust(int idx);
 };
 
 } // End of namespace MADS
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index 8ddfd1e..f5a5f3b 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -605,5 +605,9 @@ void Game::syncTimers(int slave_type, int slave_id, int master_type, int master_
 
 void Game::camPanTo(Camera *camera, int target) {
 	warning("TODO: Game::camPanTo");
+	if (camera) {
+		// Incomplete
+		camera->_panMode = 1;
+	}
 }
 } // End of namespace MADS
diff --git a/engines/mads/game.h b/engines/mads/game.h
index bdc7fc9..30fcf99 100644
--- a/engines/mads/game.h
+++ b/engines/mads/game.h
@@ -241,6 +241,7 @@ public:
 	typedef struct {
 		//TODO
 		bool _panFrame;
+		int _panMode;
 	} Camera;
 	Camera _camX, _camY;
 
diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp
index d888061..2bee77d 100644
--- a/engines/mads/messages.cpp
+++ b/engines/mads/messages.cpp
@@ -193,6 +193,10 @@ void KernelMessages::processText(int msgIndex) {
 			msg._timeout = 0;
 	}
 
+	if (msg._flags & KMSG_ANIM) {
+		warning("TODO: Implement animated text");
+	}
+
 	if ((msg._timeout <= 0) && (_vm->_game->_trigger == 0)) {
 		msg._flags |= KMSG_EXPIRE;
 		if (msg._trigger != 0) {
@@ -465,6 +469,16 @@ void KernelMessages::initRandomMessages(int maxSimultaneousMessages,
 	va_end(va);
 }
 
+void KernelMessages::setAnim(int msgId, int seqId, int val3 = 0) {
+	if (msgId < 0)
+		return;
+
+	_entries[msgId]._flags |= KMSG_ANIM;
+	_entries[msgId]._sequenceIndex = seqId;
+
+	warning("TODO: KernelMessages::setAnim, unused parameter");
+}
+
 
 /*------------------------------------------------------------------------*/
 
diff --git a/engines/mads/messages.h b/engines/mads/messages.h
index 764477a..739b203 100644
--- a/engines/mads/messages.h
+++ b/engines/mads/messages.h
@@ -39,7 +39,7 @@ namespace MADS {
 enum KernelMessageFlags {
 	KMSG_QUOTED = 1, KMSG_PLAYER_TIMEOUT = 2, KMSG_SEQ_ENTRY = 4, KMSG_SCROLL = 8,
 	KMSG_RIGHT_ALIGN = 0x10, KMSG_CENTER_ALIGN = 0x20, KMSG_EXPIRE = 0x40,
-	KMSG_ACTIVE = 0x80
+	KMSG_ACTIVE = 0x80, KMSG_ANIM = 0x100
 };
 
 class MADSEngine;
@@ -104,6 +104,7 @@ public:
 	int addQuote(int quoteId, int endTrigger, uint32 timeout);
 	void scrollMessage(int msgIndex, int numTicks, bool quoted);
 	void setSeqIndex(int msgIndex, int seqIndex);
+	void setAnim(int msgId, int seqId, int val3);
 	void remove(int msgIndex);
 	void reset();
 	void update();
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index c864605..434dc57 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -2560,5 +2560,215 @@ void Scene309::handleBoatAnimation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene310::Scene310(MADSEngine *vm) : Scene3xx(vm) {
+	_raoulMessageColor = -1;
+	_chrisMessageColor = -1;
+	_lakeFrame = -1;
+	for (int i = 0; i < 4; i++)
+		_multiplanePosX[i] = -1;
+}
+
+void Scene310::synchronize(Common::Serializer &s) {
+	Scene3xx::synchronize(s);
+
+	s.syncAsSint16LE(_raoulMessageColor);
+	s.syncAsSint16LE(_chrisMessageColor);
+	s.syncAsSint16LE(_lakeFrame);
+	for (int i = 0; i < 4; i++)
+		s.syncAsSint16LE(_multiplanePosX[i]);
+}
+
+void Scene310::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene310::enter() {
+	warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y");
+
+	for (int i = 0; i < 4; i++) {
+		_globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('f', i), false);
+		_globals._sequenceIndexes[i] = -1;
+	}
+
+	_multiplanePosX[0] = 100;
+	_multiplanePosX[1] = 210;
+	_multiplanePosX[2] = 320;
+	_multiplanePosX[3] = 472;
+
+	_game.loadQuoteSet(0x66, 0x67, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x74, 0x70, 0x68, 0x73, 0x6B, 0);
+	_game._player._stepEnabled = false;
+	_game._player._visible = false;
+	_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 80);
+	_scene->_animation[_globals._animationIndexes[0]]->_canChangeView = true;
+	_game._camX._panMode = 1;
+
+	_raoulMessageColor = 0x102;
+	_chrisMessageColor = 0x1110;
+
+	_scene->_userInterface.emptyConversationList();
+	_scene->_userInterface.setup(kInputConversation);
+
+	sceneEntrySound();
+}
+
+void Scene310::step() {
+	handleLakeAnimation();
+
+	if (_game._trigger == 80)
+		_scene->_nextSceneId = 309;
+
+	bool positionsSetFl = false;
+
+	if (_globals._animationIndexes[0] >= 0) {
+		MADS::Animation *anim = _scene->_animation[_globals._animationIndexes[0]];
+		int curFrame = anim->getCurrentFrame();
+		uint32 clock = anim->getNextFrameTimer();
+		if ((curFrame > 0) && (_scene->_frameStartTime >= clock)) {
+			Common::Point pos = anim->getFramePosAdjust(curFrame);
+			if (pos.x != _scene->_posAdjust.x) {
+				setMultiplanePos(pos.x);
+				positionsSetFl = true;
+			}
+		}
+	}
+
+	if (!positionsSetFl && (_game._fx != kTransitionNone))
+		setMultiplanePos(320);
+}
+
+void Scene310::actions() {
+}
+
+void Scene310::preActions() {
+}
+
+void Scene310::setMultiplanePos(int x_new) {
+	int center = x_new + 160;
+
+	for (int i = 0; i < 4; i++) {
+		if (_globals._sequenceIndexes[i] >= 0)
+			_scene->deleteSequence(_globals._sequenceIndexes[i]);
+
+		int difference = center - _multiplanePosX[i];
+
+		int direction = 0;
+		if (difference < 0)
+			direction = 1;
+		else if (difference > 0)
+			direction = -1;
+
+		int displace = abs(difference);
+		if (direction < 0)
+			displace = -displace;
+
+		int x = _multiplanePosX[i] + displace - 1;
+		int y = _scene->_sprites[_globals._spriteIndexes[i]]->getFrameWidth(0) + 29;
+		int halfWidth = 1 + (_scene->_sprites[_globals._spriteIndexes[i]]->getFrameHeight(0) / 2);
+
+		if (((x - halfWidth) >= (x_new + 320)) || ((x + halfWidth) < x_new))
+			_globals._sequenceIndexes[i] = -1;
+		else {
+			_globals._sequenceIndexes[i] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[i], false, 1);
+			_scene->_sequences.setPosition(_globals._sequenceIndexes[i], Common::Point(x, y));
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[i], 1);
+		}
+	}
+}
+
+void Scene310::handleLakeAnimation() {
+	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _lakeFrame)
+		return;
+
+
+	_lakeFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	int resetFrame = -1;
+	int id;
+
+	switch (_lakeFrame) {
+	case 60:
+		id = _scene->_kernelMessages.add(Common::Point(-142, 0), _chrisMessageColor, 0, 61, 600, _game.getQuote(0x66));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(-142, 15), _chrisMessageColor, 0, 0, 600, _game.getQuote(0x67));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(-142, 30), _chrisMessageColor, 0, 0, 600, _game.getQuote(0x68));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		break;
+
+	case 120:
+		_scene->_kernelMessages.reset();
+		break;
+
+	case 140:
+		id = _scene->_kernelMessages.add(Common::Point(-120, 0), _chrisMessageColor, 0, 63, 360, _game.getQuote(0x69));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(-120, 15), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x6A));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(-120, 30), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x6B));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		break;
+
+	case 200:
+		_scene->_kernelMessages.reset();
+		break;
+
+	case 220:
+		id = _scene->_kernelMessages.add(Common::Point(-32, 30), _chrisMessageColor, 0, 65, 240, _game.getQuote(0x6C));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(-32, 45), _chrisMessageColor, 0, 0, 240, _game.getQuote(0x6D));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		break;
+
+	case 280:
+		_scene->_kernelMessages.reset();
+		break;
+
+	case 300:
+		id = _scene->_kernelMessages.add(Common::Point(101, 0), _raoulMessageColor, 0, 67, 360, _game.getQuote(0x6E));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(101, 15), _raoulMessageColor, 0, 0, 360, _game.getQuote(0x6F));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(101, 30), _raoulMessageColor, 0, 0, 360, _game.getQuote(0x70));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		break;
+
+	case 360:
+		_scene->_kernelMessages.reset();
+		break;
+
+	case 380:
+		id = _scene->_kernelMessages.add(Common::Point(107, 0), _chrisMessageColor, 0, 69, 360, _game.getQuote(0x71));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(107, 15), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x72));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		id = _scene->_kernelMessages.add(Common::Point(107, 30), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x73));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		break;
+
+	case 440:
+		_scene->_kernelMessages.reset();
+		break;
+
+	case 460:
+		id = _scene->_kernelMessages.add(Common::Point(107, 7), _chrisMessageColor, 0, 0, 180, _game.getQuote(0x74));
+		_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
+		break;
+
+	case 510:
+		_scene->_kernelMessages.reset();
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_lakeFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index b6ecfe6..bea0203 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
@@ -55,12 +55,12 @@ public:
 
 class Scene301 : public Scene3xx {
 private:
-  bool _anim0ActvFl;
-  bool _skip1Fl;
-  bool _skip2Fl;
+	bool _anim0ActvFl;
+	bool _skip1Fl;
+	bool _skip2Fl;
 
-  int _lightingHotspotId;
-  int _sandbagHotspotId;
+	int _lightingHotspotId;
+	int _sandbagHotspotId;
 
 public:
 	Scene301(MADSEngine *vm);
@@ -87,7 +87,7 @@ public:
 
 class Scene303 : public Scene3xx {
 private:
-	bool _anim0ActvFl;  
+	bool _anim0ActvFl;
 	int _hempHotspotId;
 	int _skipFrameCheckFl;
 public:
@@ -221,6 +221,27 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene310 : public Scene3xx {
+private:
+	int _raoulMessageColor;
+	int _chrisMessageColor;
+	int _multiplanePosX[4];
+	int _lakeFrame;
+
+	void setMultiplanePos(int x_new);
+	void handleLakeAnimation();
+
+public:
+	Scene310(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 11753df6ff78a0ba264a2badd52f143e5f716219
    https://github.com/scummvm/scummvm/commit/11753df6ff78a0ba264a2badd52f143e5f716219
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-29T13:19:16+01:00

Commit Message:
MADS: Phantom: Implement generic scene 4xx

Changed paths:
  A engines/mads/phantom/phantom_scenes4.cpp
  A engines/mads/phantom/phantom_scenes4.h
    engines/mads/module.mk



diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index 73be5ef..ca277ea 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -11,6 +11,7 @@ MODULE_OBJS := \
 	phantom/phantom_scenes1.o \
 	phantom/phantom_scenes2.o \
 	phantom/phantom_scenes3.o \
+	phantom/phantom_scenes4.o \
 	nebular/dialogs_nebular.o \
 	nebular/game_nebular.o \
 	nebular/globals_nebular.o \
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
new file mode 100644
index 0000000..e88631e
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -0,0 +1,61 @@
+/* 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/scummsys.h"
+#include "mads/mads.h"
+#include "mads/conversations.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+#include "mads/phantom/phantom_scenes4.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+void Scene4xx::setAAName() {
+	_game._aaName = Resources::formatAAName(1);
+	_vm->_palette->setEntry(254, 43, 47, 51);
+}
+
+void Scene4xx::sceneEntrySound() {
+	if (!_vm->_musicFlag)
+		return;
+
+	_vm->_sound->command(16);
+}
+
+void Scene4xx::setPlayerSpritesPrefix() {
+	_vm->_sound->command(5);
+
+	Common::String oldName = _game._player._spritesPrefix;
+	if (!_game._player._forcePrefix)
+		_game._player._spritesPrefix = "RAL";
+	if (oldName != _game._player._spritesPrefix)
+		_game._player._spritesChanged = true;
+
+	_game._player._scalingVelocity = true;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Phantom
+} // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
new file mode 100644
index 0000000..1d9d927
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes4.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 MADS_PHANTOM_SCENES4_H
+#define MADS_PHANTOM_SCENES4_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+class Scene4xx : public PhantomScene {
+protected:
+	/**
+	 * Plays an appropriate sound when entering a scene
+	 */
+	void sceneEntrySound();
+
+	/**
+	 *Sets the AA file to use for the scene
+	 */
+	void setAAName();
+
+	/**
+	 * Updates the prefix used for getting player sprites for the scene
+	 */
+	void setPlayerSpritesPrefix();
+public:
+	Scene4xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
+};
+
+} // End of namespace Phantom
+} // End of namespace MADS
+
+#endif /* MADS_PHANTOM_SCENES4_H */


Commit: bd1f03ee6ca8c2ad6756fd83834cbbe596e13d82
    https://github.com/scummvm/scummvm/commit/bd1f03ee6ca8c2ad6756fd83834cbbe596e13d82
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-29T13:22:15+01:00

Commit Message:
MADS: Phantom: Hook scene 310

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 4043a88..3b1c02f 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -115,7 +115,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 309:	// lake and archway
 		return new Scene309(vm);
 	case 310:	// lake
-		return new DummyScene(vm);	// TODO
+		return new Scene310(vm);
 
 	// Scene group #4 (labyrinth)
 	case 401:	// labyrinth room, 3 exits


Commit: 7c4f6bae20f2848980130ea3db7f84478f78bf63
    https://github.com/scummvm/scummvm/commit/7c4f6bae20f2848980130ea3db7f84478f78bf63
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-30T11:05:07+01:00

Commit Message:
MADS: Phantom: Implement scene 401

Changed paths:
    engines/mads/assets.h
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h
    engines/mads/phantom/globals_phantom.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/assets.h b/engines/mads/assets.h
index aa7e188..0aae534 100644
--- a/engines/mads/assets.h
+++ b/engines/mads/assets.h
@@ -99,6 +99,7 @@ public:
 	int getCount() { return _frameCount; }
 	int getFrameRate() const { return _frameRate; }
 	int getPixelSpeed() const { return _pixelSpeed; }
+	Common::Point getFramePos(int index) { assert (index < _frameCount); return Common::Point(_frames[index]._bounds.left, _frames[index]._bounds.top); }
 	int getFrameWidth(int index) { assert (index < _frameCount); return _frames[index]._bounds.width(); }
 	int getFrameHeight(int index) { assert (index < _frameCount); return _frames[index]._bounds.height(); }
 	int getMaxFrameWidth() const { return _maxWidth; }
diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 2462ee3..47e09da 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -105,7 +105,7 @@ void GamePhantom::initializeGlobals() {
 	_globals[kChristineToldEnvelope]   = false;
 	_globals[kLeaveAngelMusicOn]       = false;
 	_globals[kDoorIn409IsOpen]         = false;
-	_globals[kUnknown]                 = false;
+	_globals[kPriestPistonPuke]        = false;
 	_globals[kCobwebIsCut]             = false;
 	_globals[kChristineIsInBoat]       = false;
 	_globals[kRightDoorIsOpen504]      = false;
@@ -198,6 +198,9 @@ void GamePhantom::enterCatacombs(int val) {
 	warning("TODO: enterCatacombs");
 }
 
+void GamePhantom::initCatacombs() {
+	warning("TODO: initCatacombs");
+}
 } // End of namespace Phantom
 
 } // End of namespace MADS
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 3e223cd..d6de29b 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -68,6 +68,21 @@ enum InventoryObject {
 	OBJ_OAR = 24
 };
 
+enum MazeEvent {
+	MAZE_EVENT_PUDDLE = 0x0001,
+	MAZE_EVENT_RAT_NEST = 0x0002,
+	MAZE_EVENT_SKULL = 0x0004,
+	MAZE_EVENT_POT = 0x0008,
+	MAZE_EVENT_BRICK = 0x0010,
+	MAZE_EVENT_HOLE = 0x0020,
+	MAZE_EVENT_WEB = 0x0040,
+	MAZE_EVENT_PLANK = 0x0080,
+	MAZE_EVENT_DRAIN = 0x0100,
+	MAZE_EVENT_STONE = 0x0200,
+	MAZE_EVENT_BLOCK = 0x0400,
+	MAZE_EVENT_FALLEN_BLOCK = 0x0800
+};
+
 class GamePhantom : public Game {
 	friend class Game;
 protected:
@@ -97,6 +112,9 @@ public:
 	virtual void synchronize(Common::Serializer &s, bool phase1);
 
 	void enterCatacombs(int val);
+	void initCatacombs();
+	void moveCatacombs(int dir) { warning("TODO: moveCataCombs"); };
+	int exitCatacombs(int dir) { warning("TODO: exitCatacombs"); return -1; };
 };
 
 
diff --git a/engines/mads/phantom/globals_phantom.h b/engines/mads/phantom/globals_phantom.h
index cf35b40..f120df3 100644
--- a/engines/mads/phantom/globals_phantom.h
+++ b/engines/mads/phantom/globals_phantom.h
@@ -99,9 +99,20 @@ enum GlobalId {
 
 	// Section #4 Variables
 	kCatacombsRoom          = 80,
-	// TODO
+	kCatacombsMisc          = 81,
+	kCatacombsFlag          = 82,
+	kCatacombsFrom          = 83,
+	kCatacombs309           = 84,
+	kCatacombs409a          = 85,
+	kCatacombs409b          = 86,
+	kCatacombs501           = 87,
+	kCatacombs309From       = 88,
+	kCatacombs409aFrom      = 89,
+	kCatacombs409bFrom      = 90,
+	kCatacombs501From       = 91,
+	kCatacombsNextRoom      = 92,
 	kDoorIn409IsOpen        = 93,
-	kUnknown                = 94,	// TODO
+	kPriestPistonPuke       = 94,
 	kCobwebIsCut            = 95,
 
 	// Section #5 Variables
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 3b1c02f..dc60a3d 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -31,6 +31,7 @@
 #include "mads/phantom/phantom_scenes1.h"
 #include "mads/phantom/phantom_scenes2.h"
 #include "mads/phantom/phantom_scenes3.h"
+#include "mads/phantom/phantom_scenes4.h"
 
 namespace MADS {
 
@@ -119,7 +120,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 
 	// Scene group #4 (labyrinth)
 	case 401:	// labyrinth room, 3 exits
-		return new DummyScene(vm);	// TODO
+		return new Scene401(vm);
 	case 403:	// labyrinth room (big), 4 exits + 1 bricked door, left
 		return new DummyScene(vm);	// TODO
 	case 404:	// labyrinth room, 3 exits
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index e88631e..08f4495 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -57,5 +57,501 @@ void Scene4xx::setPlayerSpritesPrefix() {
 
 /*------------------------------------------------------------------------*/
 
+Scene401::Scene401(MADSEngine *vm) : Scene4xx(vm) {
+	_anim0ActvFl = false;
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHostpotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene401::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHostpotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene401::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_PUDDLE)
+		_scene->_initialVariant = 1;
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene401::enter() {
+	_game.initCatacombs();
+	_anim0ActvFl = false;
+
+	_scene->_hotspots.activate(NOUN_PUDDLE, false);
+	_scene->_hotspots.activate(NOUN_RATS_NEST, false);
+	_scene->_hotspots.activate(NOUN_SKULL, false);
+	_scene->_hotspots.activate(NOUN_POT, false);
+
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+
+	if (_game.exitCatacombs(0) == -1) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
+	}
+
+	if (_game.exitCatacombs(3) == -1) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false);
+	}
+
+	if (_game.exitCatacombs(1) == -1) {
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false);
+	}
+
+	if (_game.exitCatacombs(2) == -1)
+		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites (formAnimName('c', 4), false);
+		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_SKULL) {
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites (formAnimName('c', 5), false);
+		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_SKULL, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_POT) {
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites (formAnimName('c', 6), false);
+		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_POT, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites (formAnimName('c', 7), false);
+		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_PUDDLE) {
+		_scene->_hotspots.activate(NOUN_PUDDLE, true);
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 0);
+		_anim0ActvFl = true;
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 0:
+			_game._player._playerPos = Common::Point(128, 78);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(128, 91), FACING_SOUTH);
+			break;
+
+		case 1:
+			_game._player._playerPos = Common::Point(311, 115);
+			_game._player._facing = FACING_WEST;
+			_game._player.walk(Common::Point(271, 123), FACING_WEST);
+			break;
+
+		case 2:
+			_game._player._playerPos = Common::Point(142, 146);
+			_game._player._facing = FACING_NORTH;
+			break;
+
+		case 3:
+			_game._player._playerPos = Common::Point(4, 113);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(48, 113), FACING_EAST);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId , Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene401::step() {
+	if (_anim0ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 20)
+			_scene->setAnimFrame(_globals._animationIndexes[0], 0);
+	}
+}
+
+void Scene401::actions() {
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) {
+			if (_frameInRoomFl)
+				_vm->_dialogs->show(29);
+			else {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+					break;
+
+				case 1:
+					if (_action.isObject(NOUN_RED_FRAME)) {
+						_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+						_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+						_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_GREEN_FRAME)) {
+						_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+						_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+						_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId , Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_BLUE_FRAME)) {
+						_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+						_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+						_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_YELLOW_FRAME)) {
+						_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+						_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+						_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+					break;
+
+				case 2:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+					_game._player._visible = true;
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE)) {
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) {
+			if ((_takingFrameInRoomFl || _game._trigger)) {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+					break;
+
+				case 1:
+					if (_action.isObject(NOUN_RED_FRAME)) {
+						_scene->deleteSequence(_globals._sequenceIndexes[9]);
+						_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+						_game._objects.addToInventory(OBJ_RED_FRAME);
+					}
+
+					if (_action.isObject(NOUN_GREEN_FRAME)) {
+						_scene->deleteSequence(_globals._sequenceIndexes[10]);
+						_scene->_dynamicHotspots.remove(_greenFrameHostpotId );
+						_game._objects.addToInventory(OBJ_GREEN_FRAME);
+					}
+
+					if (_action.isObject(NOUN_BLUE_FRAME)) {
+						_scene->deleteSequence(_globals._sequenceIndexes[11]);
+						_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+						_game._objects.addToInventory(OBJ_BLUE_FRAME);
+					}
+
+					if (_action.isObject(NOUN_YELLOW_FRAME)) {
+						_scene->deleteSequence(_globals._sequenceIndexes[12]);
+						_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+						_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+					}
+
+					_vm->_sound->command(26);
+					break;
+
+				case 2:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+					_game._player._visible = true;
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+				_action._inProgress = false;
+				return;
+			}
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) {
+		_game.moveCatacombs(0);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) {
+		_game.moveCatacombs(3);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) {
+		_game.moveCatacombs(2);
+		if ((_game._difficulty == DIFFICULTY_HARD) && (_globals[kCatacombsRoom] == 31))
+			_globals[kPriestPistonPuke] = true;
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) {
+		_game.moveCatacombs(1);
+		if ((_game._difficulty == DIFFICULTY_EASY) && (_globals[kCatacombsRoom] == 24))
+			_globals[kPriestPistonPuke] = true;
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(40110);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(40111);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(40112);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(40113);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(40114);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(40115);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) {
+			_vm->_dialogs->show(40116);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PUDDLE)) {
+			_vm->_dialogs->show(40117);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RATS_NEST)) {
+			_vm->_dialogs->show(40118);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SKULL)) {
+			_vm->_dialogs->show(40120);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+
+		if (_action.isObject(NOUN_BROKEN_POT)) {
+			_vm->_dialogs->show(40122);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) {
+		_vm->_dialogs->show(40119);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_SKULL)) {
+		_vm->_dialogs->show(40121);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BROKEN_POT)) {
+		_vm->_dialogs->show(40123);
+		_action._inProgress = false;
+	}
+}
+
+void Scene401::preActions() {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME)
+	 || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+			_game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+		}
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index 1d9d927..9f64241 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -53,6 +53,28 @@ public:
 	Scene4xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
 };
 
+class Scene401 : public Scene4xx {
+private:
+	bool _anim0ActvFl;
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHostpotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene401(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 71ea3ce56261a788ec253d3e88c92729cf77bbbf
    https://github.com/scummvm/scummvm/commit/71ea3ce56261a788ec253d3e88c92729cf77bbbf
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-30T14:14:06+01:00

Commit Message:
MADS: Phantom: Implement scene 403

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index dc60a3d..713dec0 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -122,7 +122,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 401:	// labyrinth room, 3 exits
 		return new Scene401(vm);
 	case 403:	// labyrinth room (big), 4 exits + 1 bricked door, left
-		return new DummyScene(vm);	// TODO
+		return new Scene403(vm);
 	case 404:	// labyrinth room, 3 exits
 		return new DummyScene(vm);	// TODO
 	case 406:	// labyrinth room, 2 exits
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 08f4495..667f629 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -131,25 +131,25 @@ void Scene401::enter() {
 		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
-		_globals._spriteIndexes[4] = _scene->_sprites.addSprites (formAnimName('c', 4), false);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4), false);
 		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_SKULL) {
-		_globals._spriteIndexes[5] = _scene->_sprites.addSprites (formAnimName('c', 5), false);
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5), false);
 		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_SKULL, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_POT) {
-		_globals._spriteIndexes[6] = _scene->_sprites.addSprites (formAnimName('c', 6), false);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 6), false);
 		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_POT, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites (formAnimName('c', 7), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7), false);
 		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
 	}
 
@@ -553,5 +553,502 @@ void Scene401::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene403::Scene403(MADSEngine *vm) : Scene4xx(vm) {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHostpotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene403::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHostpotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene403::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_HOLE)
+		_scene->_initialVariant = 1;
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_PLANK)
+		_scene->_initialVariant = 2;
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene403::enter() {
+	_game.initCatacombs();
+
+	_scene->_hotspots.activate(NOUN_HOLE, false);
+	_scene->_hotspots.activate(NOUN_WEB, false);
+	_scene->_hotspots.activate(NOUN_RATS_NEST, false);
+	_scene->_hotspots.activate(NOUN_SKULL, false);
+	_scene->_hotspots.activate(NOUN_PLANK, false);
+	_scene->_hotspots.activate(NOUN_GATE, false);
+
+	_globals._spriteIndexes[8]  = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[9]    = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[10]  = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[11]   = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+
+	if (_game.exitCatacombs(0) == -1) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
+	}
+
+	if (_game.exitCatacombs(3) == -1) {
+		_globals._spriteIndexes[0]  = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false);
+	}
+
+	if (_game.exitCatacombs(1) == -1) {
+		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
+		_scene->_hotspots.activate(NOUN_GATE, true);
+		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 9), false);
+		_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_HOLE) {
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 3), false);
+		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_HOLE, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 4), false);
+		_scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_WEB, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 5), false);
+		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(178, 35));
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 6), false);
+		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_SKULL) {
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 7), false);
+		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_SKULL, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_PLANK) {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 8), false);
+		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_PLANK, true);
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 0:
+			_game._player._playerPos = Common::Point(212, 86);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(212, 100), FACING_SOUTH);
+			break;
+
+		case 1:
+			_game._player.firstWalk(Common::Point(330, 126), FACING_EAST, Common::Point(305, 126), FACING_WEST, true);
+			break;
+
+		case 3:
+			_game._player._playerPos = Common::Point(3, 128);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(40, 128), FACING_EAST);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if ((_game._difficulty == DIFFICULTY_EASY) && (_globals[kCatacombsRoom] == 19))
+		_scene->_sequences.setTimingTrigger(120, 60);
+
+	sceneEntrySound();
+}
+
+void Scene403::step() {
+	if (_game._trigger == 60)
+		_vm->_dialogs->show(31);
+}
+
+void Scene403::actions() {
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { 
+		if (_frameInRoomFl)
+			_vm->_dialogs->show(29);
+		else {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled  = false;
+				_game._player._visible     = false;  
+				_globals._sequenceIndexes[8]      = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+					_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+					_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+					_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+					_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+					_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+					_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+					_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+					_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
+				_game._player._visible    = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) {
+		if ((_takingFrameInRoomFl || _game._trigger)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled  = false;
+				_game._player._visible     = false;  
+				_globals._sequenceIndexes[8]      = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[9]);
+					_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+					_game._objects.addToInventory(OBJ_RED_FRAME);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[10]);
+					_scene->_dynamicHotspots.remove(_greenFrameHostpotId);
+					_game._objects.addToInventory(OBJ_GREEN_FRAME);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[11]);
+					_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+					_game._objects.addToInventory(OBJ_BLUE_FRAME);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[12]);
+					_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+					_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+				}
+
+				_vm->_sound->command(26);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
+				_game._player._visible    = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) {
+		_game.moveCatacombs(0);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) {
+		_game.moveCatacombs(3);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(40310);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(40311);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(40312);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(40313);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(40314);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(40315);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) {
+			_vm->_dialogs->show(40316);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RATS_NEST)) {
+			_vm->_dialogs->show(40318);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SKULL)) {
+			_vm->_dialogs->show(40320);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_HOLE)) {
+			_vm->_dialogs->show(40323);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WEB)) {
+			_vm->_dialogs->show(40324);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GATE)) {
+			_vm->_dialogs->show(45330);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PLANK)) {
+			_vm->_dialogs->show(40325);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_GATE)) {
+		_vm->_dialogs->show(45331);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) {
+		_vm->_dialogs->show(40319);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_SKULL)) {
+		_vm->_dialogs->show(40321);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_PLANK)) {
+		_vm->_dialogs->show(40326);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene403::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS))
+		_game.moveCatacombs(1);
+
+	_frameInRoomFl         = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { 
+		if (_frameInRoomFl)
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+			_game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+		}
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index 9f64241..0233a32 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -75,6 +75,26 @@ public:
 	virtual void actions();
 };
 
+class Scene403 : public Scene4xx {
+private:
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHostpotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene403(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: f2e17d83fe312bdc97ebaee23f9f2b2b3a7c0968
    https://github.com/scummvm/scummvm/commit/f2e17d83fe312bdc97ebaee23f9f2b2b3a7c0968
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-30T18:24:25+01:00

Commit Message:
MADS: Phantom: Implement scene 404

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 713dec0..7366da1 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -124,7 +124,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 403:	// labyrinth room (big), 4 exits + 1 bricked door, left
 		return new Scene403(vm);
 	case 404:	// labyrinth room, 3 exits
-		return new DummyScene(vm);	// TODO
+		return new Scene404(vm);
 	case 406:	// labyrinth room, 2 exits
 		return new DummyScene(vm);	// TODO
 	case 407:	// catacomb room / lake
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 667f629..4edea79 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -601,10 +601,10 @@ void Scene403::enter() {
 	_scene->_hotspots.activate(NOUN_PLANK, false);
 	_scene->_hotspots.activate(NOUN_GATE, false);
 
-	_globals._spriteIndexes[8]  = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[9]    = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[10]  = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[11]   = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
 	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
 
 	if (_game.exitCatacombs(0) == -1) {
@@ -614,7 +614,7 @@ void Scene403::enter() {
 	}
 
 	if (_game.exitCatacombs(3) == -1) {
-		_globals._spriteIndexes[0]  = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false);
 	}
@@ -734,15 +734,15 @@ void Scene403::step() {
 
 void Scene403::actions() {
 	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
-	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { 
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
 		if (_frameInRoomFl)
 			_vm->_dialogs->show(29);
 		else {
 			switch (_game._trigger) {
 			case (0):
-				_game._player._stepEnabled  = false;
-				_game._player._visible     = false;  
-				_globals._sequenceIndexes[8]      = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
@@ -796,8 +796,8 @@ void Scene403::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
-				_game._player._visible    = true;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
 
@@ -814,9 +814,9 @@ void Scene403::actions() {
 		if ((_takingFrameInRoomFl || _game._trigger)) {
 			switch (_game._trigger) {
 			case (0):
-				_game._player._stepEnabled  = false;
-				_game._player._visible     = false;  
-				_globals._sequenceIndexes[8]      = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
 				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
@@ -852,8 +852,8 @@ void Scene403::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
-				_game._player._visible    = true;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
 
@@ -1010,7 +1010,7 @@ void Scene403::preActions() {
 	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS))
 		_game.moveCatacombs(1);
 
-	_frameInRoomFl         = false;
+	_frameInRoomFl = false;
 	_takingFrameInRoomFl = false;
 
 	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
@@ -1038,7 +1038,7 @@ void Scene403::preActions() {
 	}
 
 	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
-	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { 
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
 		if (_frameInRoomFl)
 			_game._player._needToWalk = false;
 		else {
@@ -1050,5 +1050,507 @@ void Scene403::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene404::Scene404(MADSEngine *vm) : Scene4xx(vm) {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+	_anim0ActvFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHostpotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene404::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+	s.syncAsByte(_anim0ActvFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHostpotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene404::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_BLOCK)
+		_scene->_initialVariant = 1;
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene404::enter() {
+	_game.initCatacombs();
+
+	_scene->_hotspots.activate(NOUN_RATS_NEST, false);
+	_scene->_hotspots.activate(NOUN_WEB, false);
+	_scene->_hotspots.activate(NOUN_BROKEN_POT, false);
+	_scene->_hotspots.activate(NOUN_BLOCK, false);
+	_scene->_hotspots.activate(NOUN_PUDDLE, false);
+
+	_anim0ActvFl = false;
+
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+
+
+	if (_game.exitCatacombs(0) == -1) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
+	}
+
+	if (_game.exitCatacombs(3) == -1) {
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false);
+	}
+
+	if (_game.exitCatacombs(1) == -1) {
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false);
+	}
+
+	if (_game.exitCatacombs(2) == -1)
+		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3), false);
+		_scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4), false);
+		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_WEB, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_POT) {
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5), false);
+		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_BROKEN_POT, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_BLOCK) {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7), false);
+		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_FALLEN_BLOCK) {
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 8), false);
+		_scene->drawToBackground(_globals._spriteIndexes[8], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_BLOCK, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_PUDDLE) {
+		_scene->_hotspots.activate(NOUN_PUDDLE, true);
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 0);
+		_anim0ActvFl = true;
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 0:
+			_game._player._playerPos = Common::Point(156, 98);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(156, 117), FACING_SOUTH);
+			break;
+
+		case 1:
+			_game._player._playerPos = Common::Point(319, 135);
+			_game._player._facing = FACING_WEST;
+			_game._player.walk(Common::Point(279, 135), FACING_WEST);
+			break;
+
+		case 2:
+			_game._player._playerPos = Common::Point(175, 147);
+			_game._player._facing = FACING_NORTH;
+			break;
+
+		case 3:
+			_game._player._playerPos = Common::Point(17, 131);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(60, 131), FACING_EAST);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+		_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_globals[kPriestPistonPuke])
+		_scene->_sequences.setTimingTrigger(120, 60);
+
+	sceneEntrySound();
+}
+
+void Scene404::step() {
+	if (_anim0ActvFl) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 20)
+			_scene->setAnimFrame(_globals._animationIndexes[0], 0);
+	}
+
+	if (_game._trigger == 60) {
+		_vm->_dialogs->show(30);
+		_globals[kPriestPistonPuke] = false;
+	}
+}
+
+void Scene404::actions() {
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_vm->_dialogs->show(29);
+		else {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[9], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+					_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+					_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+					_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+					_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+					_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+					_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+					_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+					_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[9]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE)) {
+		if ((_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) && (_takingFrameInRoomFl || _game._trigger)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[9], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[10]);
+					_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+					_game._objects.addToInventory(OBJ_RED_FRAME);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[11]);
+					_scene->_dynamicHotspots.remove(_greenFrameHostpotId);
+					_game._objects.addToInventory(OBJ_GREEN_FRAME);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[12]);
+					_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+					_game._objects.addToInventory(OBJ_BLUE_FRAME);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[13]);
+					_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+					_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+				}
+
+				_vm->_sound->command(26);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[9]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) {
+		_game.moveCatacombs(0);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) {
+		_game.moveCatacombs(3);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) {
+		_game.moveCatacombs(2);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) {
+		_game.moveCatacombs(1);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(40410);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(40411);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(40412);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(40413);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(40414);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(40415);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PUDDLE)) {
+			_vm->_dialogs->show(40417);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RATS_NEST)) {
+			_vm->_dialogs->show(40418);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BROKEN_POT)) {
+			_vm->_dialogs->show(40421);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WEB)) {
+			_vm->_dialogs->show(40424);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLOCK)) {
+			_vm->_dialogs->show(40430);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) {
+		_vm->_dialogs->show(40419);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BROKEN_POT)) {
+		_vm->_dialogs->show(40422);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BLOCK)) {
+		_vm->_dialogs->show(40431);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene404::preActions() {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0);
+			_game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+		}
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index 0233a32..be07183 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -95,6 +95,28 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene404 : public Scene4xx {
+private:
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+	bool _anim0ActvFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHostpotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene404(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 89684642bb7e22e44837d54c2a7546da3eafe1a7
    https://github.com/scummvm/scummvm/commit/89684642bb7e22e44837d54c2a7546da3eafe1a7
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-31T00:47:43+01:00

Commit Message:
MADS: Phantom: Add scene 406

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 7366da1..e463743 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -126,7 +126,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 404:	// labyrinth room, 3 exits
 		return new Scene404(vm);
 	case 406:	// labyrinth room, 2 exits
-		return new DummyScene(vm);	// TODO
+		return new Scene406(vm);
 	case 407:	// catacomb room / lake
 		return new DummyScene(vm);	// TODO
 	case 408:	// catacomb corridor
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 4edea79..755a5cb 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -1552,5 +1552,411 @@ void Scene404::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene406::Scene406(MADSEngine *vm) : Scene4xx(vm) {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHostpotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene406::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHostpotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene406::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene406::enter() {
+	_game.initCatacombs();
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 1:
+			_game._player._playerPos = Common::Point(310, 118);
+			_game._player._facing = FACING_WEST;
+			_game._player.walk(Common::Point(271, 118), FACING_WEST);
+			break;
+
+		case 3:
+			_game._player._playerPos = Common::Point(20, 122);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(66, 122), FACING_EAST);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+		_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene406::step() {
+}
+
+void Scene406::actions() {
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_vm->_dialogs->show(29);
+		else {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+					_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+					_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+					_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+					_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+					_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+					_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+					_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+					_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) {
+		if ((_takingFrameInRoomFl || _game._trigger)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[1]);
+					_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+					_game._objects.addToInventory(OBJ_RED_FRAME);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[2]);
+					_scene->_dynamicHotspots.remove(_greenFrameHostpotId);
+					_game._objects.addToInventory(OBJ_GREEN_FRAME);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[3]);
+					_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+					_game._objects.addToInventory(OBJ_BLUE_FRAME);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[4]);
+					_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+					_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+				}
+
+				_vm->_sound->command(26);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) {
+		_game.moveCatacombs(3);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) {
+		_game.moveCatacombs(1);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(40610);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(40611);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(40612);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(40613);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(40614);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(40615);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) {
+			_vm->_dialogs->show(40616);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GRATE)) {
+			_vm->_dialogs->show(40617);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_GRATE) || _action.isAction(VERB_PUSH, NOUN_GRATE) || _action.isAction(VERB_PULL, NOUN_GRATE)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], true, 5, 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+			break;
+
+		case 2:
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], true, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+			_scene->_sequences.setTimingTrigger(30, 3);
+			break;
+
+		case 3:
+			_scene->deleteSequence(_globals._sequenceIndexes[0]);
+			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], true, 5, 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 4);
+			break;
+
+		case 4:
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_scene->_sequences.setTimingTrigger(6, 5);
+			break;
+
+		case 5:
+			_game._player._stepEnabled = true;
+			_vm->_dialogs->show(40618);
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+	}
+}
+
+void Scene406::preActions() {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+			pos.x += 12;
+			_game._player.walk(pos, FACING_NORTHWEST);
+		}
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index be07183..a53179c 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -117,6 +117,27 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene406 : public Scene4xx {
+private:
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHostpotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene406(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 2243a976ce23513814d1240eade20dc2128666a1
    https://github.com/scummvm/scummvm/commit/2243a976ce23513814d1240eade20dc2128666a1
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-10-31T15:59:20+01:00

Commit Message:
MADS: Phantom: Implement scene 407

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index e463743..e117a92 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -128,7 +128,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 406:	// labyrinth room, 2 exits
 		return new Scene406(vm);
 	case 407:	// catacomb room / lake
-		return new DummyScene(vm);	// TODO
+		return new Scene407(vm);
 	case 408:	// catacomb corridor
 		return new DummyScene(vm);	// TODO
 	case 409:	// catacomb room, door with switch panel
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 755a5cb..ef3d1a0 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -1958,5 +1958,471 @@ void Scene406::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene407::Scene407(MADSEngine *vm) : Scene4xx(vm) {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHotspotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene407::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHotspotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene407::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene407::enter() {
+	_game.initCatacombs();
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+
+	if (_game.exitCatacombs(3) == -1) {
+		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(9, 46));
+		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(8, 138));
+		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(12, 149));
+		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(0, 151));
+	}
+
+	if (_game.exitCatacombs(1) == -1) {
+		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(310, 107));
+		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(308, 175));
+		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(308, 146));
+		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(309, 152));
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 0:
+			_game._player._playerPos = Common::Point(197, 14);
+			_game._player._facing = FACING_WEST;
+			_game._player.walk(Common::Point(181, 14), FACING_WEST);
+			break;
+
+		case 1:
+			_game._player.firstWalk(Common::Point(330, 146), FACING_WEST, Common::Point(298, 146), FACING_WEST, true);
+			break;
+
+		case 2:
+			_game._player._playerPos = Common::Point(147, 14);
+			_game._player._facing = FACING_EAST;
+			_game._player.walk(Common::Point(165, 14), FACING_EAST);
+			break;
+
+		case 3:
+			_game._player.firstWalk(Common::Point(-20, 143), FACING_WEST, Common::Point(20, 143), FACING_WEST, true);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+		_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene407::step() {
+}
+
+void Scene407::actions() {
+	if (_action.isAction(VERB_WALK_TO, NOUN_WALL) && (_game._player._playerPos.y > 30) && (_scene->_customDest.x > 160) && (_scene->_customDest.x < 190)) {
+		_vm->_dialogs->show(40718);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_TO) && (_scene->_customDest.x < 130) && (_game._player._playerPos.y < 30)) {
+		_vm->_dialogs->show(40718);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_TO) && (_scene->_customDest.x > 203) && (_game._player._playerPos.y < 30)) {
+		_vm->_dialogs->show(40718);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_TO, NOUN_FLOOR)) {
+		if ((_game._player._playerPos.y < 30) && (_scene->_customDest.y > 29)) {
+			_vm->_dialogs->show(40718);
+			_action._inProgress = false;
+			return;
+		} else if ((_game._player._playerPos.y > 29) && (_scene->_customDest.y < 30)) {
+			_vm->_dialogs->show(40718);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) {
+			if ((_game._player._playerPos.y < 30) && (_scene->_customDest.y < 30))
+				_vm->_dialogs->show(40717);
+			else if ((_game._player._playerPos.y < 30) && (_scene->_customDest.y > 29))
+				_vm->_dialogs->show(40718);
+			else if (_frameInRoomFl)
+				_vm->_dialogs->show(29);
+			else {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+					break;
+
+				case 1:
+					if (_action.isObject(NOUN_RED_FRAME)) {
+						_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+						_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+						_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_GREEN_FRAME)) {
+						_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+						_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+						_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_BLUE_FRAME)) {
+						_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+						_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+						_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_YELLOW_FRAME)) {
+						_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+						_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+						_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+					break;
+
+				case 2:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+					_game._player._visible = true;
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE)) {
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) {
+			if ((_takingFrameInRoomFl || _game._trigger)) {
+				if (_game._player._playerPos.y < 30)
+					_vm->_dialogs->show(40718);
+				else {
+					switch (_game._trigger) {
+					case (0):
+						_game._player._stepEnabled = false;
+						_game._player._visible = false;
+						_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
+						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+						_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+						_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
+						_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+						break;
+
+					case 1:
+						if (_action.isObject(NOUN_RED_FRAME)) {
+							_scene->deleteSequence(_globals._sequenceIndexes[1]);
+							_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+							_game._objects.addToInventory(OBJ_RED_FRAME);
+						}
+
+						if (_action.isObject(NOUN_GREEN_FRAME)) {
+							_scene->deleteSequence(_globals._sequenceIndexes[2]);
+							_scene->_dynamicHotspots.remove(_greenFrameHotspotId);
+							_game._objects.addToInventory(OBJ_GREEN_FRAME);
+						}
+
+						if (_action.isObject(NOUN_BLUE_FRAME)) {
+							_scene->deleteSequence(_globals._sequenceIndexes[3]);
+							_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+							_game._objects.addToInventory(OBJ_BLUE_FRAME);
+						}
+
+						if (_action.isObject(NOUN_YELLOW_FRAME)) {
+							_scene->deleteSequence(_globals._sequenceIndexes[4]);
+							_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+							_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+						}
+
+						_vm->_sound->command(26);
+						break;
+
+					case 2:
+						_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+						_game._player._visible = true;
+						_game._player._stepEnabled = true;
+						break;
+
+					default:
+						break;
+					}
+				}
+				_action._inProgress = false;
+				return;
+			}
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) {
+		if (_game._player._playerPos.y < 30)
+			_game.moveCatacombs(2);
+		else
+			_vm->_dialogs->show(40718);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) {
+		if (_game._player._playerPos.y < 30)
+			_game.moveCatacombs(0);
+		else
+			_vm->_dialogs->show(40718);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS) && (_game._player._playerPos.y < 30)) {
+		_vm->_dialogs->show(40718);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(40710);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(40711);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(40712);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(40713);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(40714);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_COLUMN)) {
+			_vm->_dialogs->show(40715);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 818, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LAKE)) {
+			_vm->_dialogs->show(40716);
+			_action._inProgress = false;
+		}
+	}
+}
+
+void Scene407::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) {
+		if (_game._player._playerPos.y > 30) {
+			if (_scene->_customDest.x < 100)
+				_game.moveCatacombs(3);
+			else
+				_game.moveCatacombs(1);
+		} else
+			_game._player._needToWalk = false;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH) && (_game._player._playerPos.y > 30))
+		_game._player._needToWalk = false;
+
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if ((_frameInRoomFl) || (_game._player._playerPos.y < 30) || (_scene->_customDest.y < 30))
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
+			_game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) {
+		if (_takingFrameInRoomFl && (_game._player._playerPos.y < 30))
+			_game._player._needToWalk = false;
+	}
+
+	if (_action.isAction(VERB_WALK_ACROSS, NOUN_FLOOR) && (_game._player._playerPos.y < 30) && (_scene->_customDest.y > 29))
+		_game._player._needToWalk = false;
+
+	if (_action.isAction(VERB_WALK_TO, NOUN_LAKE) && (_game._player._playerPos.y < 30))
+		_game._player.walk(Common::Point(172, 18), FACING_SOUTH);
+
+	if (_action.isAction(VERB_WALK_TO) && (_scene->_customDest.x < 130) && (_game._player._playerPos.y < 30))
+		_game._player._needToWalk = false;
+
+	if (_action.isAction(VERB_WALK_TO) && (_scene->_customDest.x > 203) && (_game._player._playerPos.y < 30))
+		_game._player._needToWalk = false;
+
+	if (_action.isAction(VERB_WALK_TO, NOUN_WALL) && (_game._player._playerPos.y > 30) && (_scene->_customDest.x > 160) && (_scene->_customDest.x < 190))
+			_game._player._needToWalk = false;
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index a53179c..a992cea 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -138,6 +138,27 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene407 : public Scene4xx {
+private:
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHotspotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene407(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 6c53d6b391ed5e39ba6ae3423a64cb3ba5a4b008
    https://github.com/scummvm/scummvm/commit/6c53d6b391ed5e39ba6ae3423a64cb3ba5a4b008
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-01T00:04:03+01:00

Commit Message:
MADS: Phantom: Implement scene 408

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index e117a92..13c5a41 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -130,7 +130,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 407:	// catacomb room / lake
 		return new Scene407(vm);
 	case 408:	// catacomb corridor
-		return new DummyScene(vm);	// TODO
+		return new Scene408(vm);
 	case 409:	// catacomb room, door with switch panel
 		return new DummyScene(vm);	// TODO
 	case 410:	// skull switch panel
diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index e382407..0987d6f 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -46,6 +46,7 @@ enum Verb {
 	VERB_CLOSE = 0xB,
 	VERB_THROW = 0xC,
 	VERB_WALK_TO = 0xD,
+	VERB_ATTACK = 0x14,
 	VERB_CLIMB_DOWN = 0x21,
 	VERB_CLIMB_INTO = 0x22,
 	VERB_CLIMB_THROUGH = 0x23,
@@ -80,7 +81,6 @@ enum Noun {
 	NOUN_ACT_CURTAIN = 0x11,
 	NOUN_AISLE = 0x12,
 	NOUN_APRON = 0x13,
-	NOUN_ATTACK = 0x14,
 	NOUN_BACKSTAGE = 0x15,
 	NOUN_BEAR_PROP = 0x16,
 	NOUN_BLUE_FRAME = 0x17,
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index ef3d1a0..2157e11 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -2424,5 +2424,474 @@ void Scene407::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene408::Scene408(MADSEngine *vm) : Scene4xx(vm) {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHotspotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene408::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHotspotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene408::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if ((_globals[kCatacombsMisc] & MAZE_EVENT_WEB) && (!_globals[kCobwebIsCut]))
+		_scene->_initialVariant = 1;
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene408::enter() {
+	_game.initCatacombs();
+	_scene->_hotspots.activate(NOUN_COBWEB, false);
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+
+	if (_game.exitCatacombs(0) == -1) {
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
+		_scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(147, 121));
+		_scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(153, 121));
+		_scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(154, 115));
+		_scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(161, 101));
+		_scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(162, 106));
+		_scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(187, 107));
+		_scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(185, 101));
+		_scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(192, 119));
+		_scene->_hotspots.activateAtPos(NOUN_WALL, false, Common::Point(147, 76));
+		_scene->_hotspots.activateAtPos(NOUN_WALL, false, Common::Point(159, 108));
+		_scene->_hotspots.activateAtPos(NOUN_WALL, false, Common::Point(185, 93));
+		_scene->_hotspots.activateAtPos(NOUN_WALL, false, Common::Point(199, 91));
+		_scene->changeVariant(1);
+	} else
+		_scene->_hotspots.activate(NOUN_GATE, false);
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 0:
+			_game._player._playerPos = Common::Point(174, 100);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(174, 106), FACING_SOUTH);
+			break;
+
+		case 2:
+			_game._player._playerPos = Common::Point(175, 145);
+			_game._player._facing = FACING_NORTH;
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites (formAnimName('x', -1), false);
+		if (!_globals[kCobwebIsCut]) {
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites (formAnimName('c', 1), false);
+			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10);
+			_scene->_hotspots.activate(NOUN_COBWEB, true);
+		} else {
+			_globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 10);
+
+			int idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(199, 112, 199 + 6, 112 + 12));
+			_scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 125), FACING_NORTHEAST);
+			idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(202, 81, 202 + 5, 81 + 31));
+			_scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 125), FACING_NORTHEAST);
+
+			idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(138, 74, 138 + 7, 74 + 33));
+			_scene->_dynamicHotspots.setPosition(idx, Common::Point(154, 124), FACING_NORTHWEST);
+			idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(143, 107, 143 + 6, 107 + 15));
+			_scene->_dynamicHotspots.setPosition(idx, Common::Point(154, 124), FACING_NORTHWEST);
+		}
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites (formAnimName('c', 2), false);
+		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_EXPOSED_BRICK, false);
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if ((_game._difficulty == DIFFICULTY_HARD) && (_globals[kCatacombsRoom] == 52))
+		_scene->_sequences.setTimingTrigger(120, 60);
+
+	sceneEntrySound();
+}
+
+void Scene408::step() {
+	if (_game._trigger == 60)
+		_vm->_dialogs->show(31);
+}
+
+void Scene408::actions() {
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_vm->_dialogs->show(29);
+		else {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+					_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+					_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+					_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+					_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+					_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+					_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+					_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+					_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+
+					Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+					_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+					_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+				}
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+
+	if (_action.isAction(VERB_TAKE)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) {
+		if ((_takingFrameInRoomFl || _game._trigger)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[2]);
+					_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+					_game._objects.addToInventory(OBJ_RED_FRAME);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[3]);
+					_scene->_dynamicHotspots.remove(_greenFrameHotspotId);
+					_game._objects.addToInventory(OBJ_GREEN_FRAME);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[4]);
+					_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+					_game._objects.addToInventory(OBJ_BLUE_FRAME);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[5]);
+					_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+					_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+				}
+
+				_vm->_sound->command(26);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) {
+		_game.moveCatacombs(0);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) {
+		_game.moveCatacombs(2);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(40810);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(40811);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(40812);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(40813);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(40814);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(40815);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(40816);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GATE)) {
+			_vm->_dialogs->show(40817);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_COBWEB)) {
+			if (_globals[kCobwebIsCut])
+				_vm->_dialogs->show(40820);
+			else
+				_vm->_dialogs->show(40819);
+
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if ((_action.isAction(VERB_ATTACK, NOUN_COBWEB) && !_globals[kCobwebIsCut])) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('W', 1), 70);
+		_game._player._visible = false;
+		_game._player._stepEnabled = false;
+		_globals[kCobwebIsCut] = true;
+		_scene->deleteSequence(_globals._sequenceIndexes[6]);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_game._trigger == 70) {
+		_globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 14);
+		_scene->changeVariant(0);
+		_scene->_hotspots.activate(NOUN_COBWEB, false);
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+
+		int idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(199, 112, 199 + 6, 112 + 12));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 125), FACING_NORTHEAST);
+		idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(202, 81, 202 + 5, 81 + 31));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 125), FACING_NORTHEAST);
+
+		idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(138, 74, 138 + 7, 74 + 33));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(154, 124), FACING_NORTHWEST);
+		idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(143, 107, 143 + 6, 107 + 15));
+		_scene->_dynamicHotspots.setPosition(idx, Common::Point(154, 124), FACING_NORTHWEST);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_GATE)) {
+		_vm->_dialogs->show(40818);
+		_action._inProgress = false;
+	}
+}
+
+void Scene408::preActions() {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+			_game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+		}
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index a992cea..b20585c 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -159,6 +159,27 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene408 : public Scene4xx {
+private:
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHotspotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene408(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: d449751c399c47ab971a1d9dfae5e9281e90a447
    https://github.com/scummvm/scummvm/commit/d449751c399c47ab971a1d9dfae5e9281e90a447
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-01T19:26:59+01:00

Commit Message:
MADS: Phantom: Implement scene 409

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 13c5a41..f6007c2 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -132,7 +132,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 408:	// catacomb corridor
 		return new Scene408(vm);
 	case 409:	// catacomb room, door with switch panel
-		return new DummyScene(vm);	// TODO
+		return new Scene409(vm);
 	case 410:	// skull switch panel
 		return new DummyScene(vm);	// TODO
 	case 453:	// Labyrinth room (big), 4 exits + 1 bricked door, right
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 2157e11..f76e3e1 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -2893,5 +2893,617 @@ void Scene408::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene409::Scene409(MADSEngine *vm) : Scene4xx(vm) {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHotspotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene409::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHotspotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene409::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene409::enter() {
+	_game.initCatacombs();
+
+	_scene->loadSpeech(3);
+	_scene->_hotspots.activate(NOUN_SWORD, false);
+
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+
+	if (_game._objects.isInRoom(OBJ_SWORD)) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+		_scene->_hotspots.activate(NOUN_SWORD, true);
+	}
+
+
+	if (!_globals[kDoorIn409IsOpen]) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
+	} else
+		_scene->_hotspots.activate(NOUN_DOOR, false);
+0
+	if (_scene->_priorSceneId == 410) {
+		_game._player._facing = FACING_NORTH;
+		_game._player._playerPos = Common::Point(229, 106);
+
+		if (_globals[kFlickedLever1] && _globals[kFlickedLever2] && _globals[kFlickedLever3] && _globals[kFlickedLever4]) {
+			if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18) && (_globals[kFlickedLever3] == 9) && (_globals[kFlickedLever4] == 11)) {
+				if (!_globals[kDoorIn409IsOpen]) {
+					_globals[kPlayerScore] += 5;
+					_vm->_sound->command(24);
+					_scene->deleteSequence(_globals._sequenceIndexes[6]);
+					_game._player._stepEnabled = false;
+					_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -1, -2);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 65);
+				}
+			} else {
+				_globals[kFlickedLever1] = 0;
+				_globals[kFlickedLever2] = 0;
+				_globals[kFlickedLever3] = 0;
+				_globals[kFlickedLever4] = 0;
+				_game._player._stepEnabled = false;
+				_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 15, 60);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 61);
+				_vm->_sound->command(68);
+			}
+		} else {
+			_globals[kFlickedLever1] = 0;
+			_globals[kFlickedLever2] = 0;
+			_globals[kFlickedLever3] = 0;
+			_globals[kFlickedLever4] = 0;
+		}
+	} else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 0:
+			_game._player._playerPos = Common::Point(195, 92);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(195, 107), FACING_SOUTH);
+			break;
+
+		case 2:
+			_game._player._playerPos = Common::Point(184, 45);
+			_game._player._facing = FACING_NORTH;
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+		_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene409::step() {
+	if (_game._trigger == 60) {
+		_game._player._visible = false;
+		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+		_scene->playSpeech(3);
+	}
+
+	if (_game._trigger == 61) {
+		_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+		_scene->_sequences.setTimingTrigger(60, 62);
+		_vm->_sound->command(27);
+	}
+
+	if (_game._trigger == 62)
+		_scene->_reloadSceneFlag = true;
+
+	if (_game._trigger == 65) {
+		_game._player._stepEnabled = true;
+		_globals[kDoorIn409IsOpen] = true;
+		_scene->_hotspots.activate(NOUN_DOOR, false);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, true);
+	}
+}
+
+void Scene409::actions() {
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 5, 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 4, 4);
+			_action._inProgress = false;
+			return;
+
+		case 1: {
+			int syncIdx = _globals._sequenceIndexes[8];
+			_globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, 4);
+			_game.syncTimers(1, _globals._sequenceIndexes[8], 1, syncIdx);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], false);
+			_scene->_sequences.setTimingTrigger(30, 2);
+			_action._inProgress = false;
+			}
+			return;
+
+		case 2:
+			_scene->deleteSequence(_globals._sequenceIndexes[8]);
+			_globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 5, 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], false);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 3);
+			_action._inProgress = false;
+			return;
+
+		case 3:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+			_game._player._visible = true;
+			_vm->_dialogs->show(40923);
+			_game._player._stepEnabled = true;
+			_action._inProgress = false;
+			return;
+
+		case 4:
+			_vm->_sound->command(70);
+			_action._inProgress = false;
+			return;
+
+		default:
+			break;
+		}
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) {
+			if (_frameInRoomFl) {
+				_vm->_dialogs->show(29);
+			} else {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+					break;
+
+				case 1:
+					if (_action.isObject(NOUN_RED_FRAME)) {
+						_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+						_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+						_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_GREEN_FRAME)) {
+						_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+						_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+						_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_BLUE_FRAME)) {
+						_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+						_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+						_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_YELLOW_FRAME)) {
+						_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+						_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+						_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+					break;
+
+				case 2:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+					_game._player._visible = true;
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE)) {
+		if ((_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))
+		 && (_takingFrameInRoomFl || _game._trigger)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[2]);
+					_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+					_game._objects.addToInventory(OBJ_RED_FRAME);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[3]);
+					_scene->_dynamicHotspots.remove(_greenFrameHotspotId);
+					_game._objects.addToInventory(OBJ_GREEN_FRAME);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[4]);
+					_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+					_game._objects.addToInventory(OBJ_BLUE_FRAME);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[5]);
+					_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+					_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+				}
+
+				_vm->_sound->command(26);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) {
+		_game.enterCatacombs(true);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) {
+		_game.enterCatacombs(false);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(40910);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_SWORD) && (_game._objects.isInRoom(OBJ_SWORD) || _game._trigger)) {
+		switch (_game._trigger) {
+		case (0):
+			_globals[kPlayerScore] += 5;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[1]);
+			_scene->_hotspots.activate(NOUN_SWORD, false);
+			_game._objects.addToInventory(OBJ_SWORD);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			_vm->_dialogs->showItem(OBJ_SWORD, 808, 0);
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(40911);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(40912);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(40913);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(40914);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(40915);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) {
+			_vm->_dialogs->show(40916);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GRATE)) {
+			_vm->_dialogs->show(40917);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_UNLUCKY_ADVENTURER)) {
+			_vm->_dialogs->show(40920);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+				_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+				_action._inProgress = false;
+				return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+				_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+				_action._inProgress = false;
+				return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+				_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+				_action._inProgress = false;
+				return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+				_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+				_action._inProgress = false;
+				return;
+		}
+
+		if (_action.isObject(NOUN_SWORD) && _game._objects.isInRoom(OBJ_SWORD)) {
+			_vm->_dialogs->show(40921);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_SWITCH_PANEL)) {
+		_vm->_dialogs->show(40919);
+		_scene->_nextSceneId = 410;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_TO, NOUN_SWITCH_PANEL)) {
+		_scene->_nextSceneId = 410;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_GRATE) || _action.isAction(VERB_PUSH, NOUN_GRATE) || _action.isAction(VERB_PULL, NOUN_GRATE)) {
+		switch (_game._trigger) {
+		case (0):
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+			break;
+
+		case 2:
+			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+			_scene->_sequences.setTimingTrigger(30, 3);
+			break;
+
+		case 3:
+			_scene->deleteSequence(_globals._sequenceIndexes[0]);
+			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 4);
+			break;
+
+		case 4:
+			_game._player._visible = true;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_scene->_sequences.setTimingTrigger(6, 5);
+			break;
+
+		case 5:
+			_game._player._stepEnabled = true;
+			_vm->_dialogs->show(40918);
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_UNLUCKY_ADVENTURER)) {
+		_vm->_dialogs->show(40924);
+		_action._inProgress = false;
+	}
+}
+
+void Scene409::preActions() {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+			_game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+		}
+	}
+
+	if (_action.isAction(VERB_LOOK, NOUN_SWITCH_PANEL))
+		_game._player.walk(Common::Point(229, 106), FACING_NORTH);
+
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+		_game._player.walk(Common::Point(191, 104), FACING_NORTHEAST);
+
+	if (_action.isAction(VERB_OPEN, NOUN_GRATE))
+		_game._player._needToWalk = true;
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index b20585c..0de833f 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -180,6 +180,28 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene409 : public Scene4xx {
+private:
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHotspotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene409(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 70de0278af72e1dcd532dc73875d07928fc8d553
    https://github.com/scummvm/scummvm/commit/70de0278af72e1dcd532dc73875d07928fc8d553
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-01T23:04:15+01:00

Commit Message:
MADS: Phantom: Remove parasite character which breaks compilation

Changed paths:
    engines/mads/phantom/phantom_scenes4.cpp



diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index f76e3e1..fba635d 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -2948,14 +2948,13 @@ void Scene409::enter() {
 		_scene->_hotspots.activate(NOUN_SWORD, true);
 	}
 
-
 	if (!_globals[kDoorIn409IsOpen]) {
 		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
 	} else
 		_scene->_hotspots.activate(NOUN_DOOR, false);
-0
+
 	if (_scene->_priorSceneId == 410) {
 		_game._player._facing = FACING_NORTH;
 		_game._player._playerPos = Common::Point(229, 106);


Commit: a7ebf1b755ed8c7e2cd517395a6c279d27d5cc1a
    https://github.com/scummvm/scummvm/commit/a7ebf1b755ed8c7e2cd517395a6c279d27d5cc1a
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-02T15:40:13+01:00

Commit Message:
MADS: Phantom: Implement scene 410

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index f6007c2..6de2461 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -134,7 +134,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 409:	// catacomb room, door with switch panel
 		return new Scene409(vm);
 	case 410:	// skull switch panel
-		return new DummyScene(vm);	// TODO
+		return new Scene410(vm);
 	case 453:	// Labyrinth room (big), 4 exits + 1 bricked door, right
 		return new DummyScene(vm);	// TODO
 	case 456:	// Labyrinth room, 2 exits
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index fba635d..1f3d2da 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -3504,5 +3504,626 @@ void Scene409::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene410::Scene410(MADSEngine *vm) : Scene4xx(vm) {
+	for (int i = 0; i < 26; i++)
+		_skullSequence[i];
+}
+
+void Scene410::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	for (int i = 0; i < 26; i++)
+		s.syncAsSint16LE(_skullSequence[i]);
+}
+
+void Scene410::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene410::enter() {
+	_game._player._visible = false;
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('l', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('l', 1), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('l', 2), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+
+	for (int i = 1; i < 27; i++) {
+		Common::Point pos;
+		int type;
+
+		getLeverInfo(&pos, &type, i, NULL);
+		int stampType = -1;
+
+		switch (type) {
+		case 1:
+			stampType = _globals._spriteIndexes[0];
+			break;
+
+		case 2:
+			stampType = _globals._spriteIndexes[1];
+			break;
+
+		case 3:
+			stampType = _globals._spriteIndexes[2];
+			break;
+
+		default:
+			break;
+		}
+
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, 1);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+		_skullSequence[i - 1] = _globals._sequenceIndexes[0];
+	}
+
+	if (_globals[kFlickedLever1]) {
+		Common::Point pos;
+		int type;
+
+		getLeverInfo(&pos, &type, _globals[kFlickedLever1], NULL);
+		int stampType = -1;
+
+		switch (type) {
+		case 1:
+			stampType = _globals._spriteIndexes[0];
+			break;
+
+		case 2:
+			stampType = _globals._spriteIndexes[1];
+			break;
+
+		case 3:
+			stampType = _globals._spriteIndexes[2];
+			break;
+
+		default:
+			break;
+		}
+		_scene->deleteSequence(_skullSequence[_globals[kFlickedLever1] - 1]);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, -2);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+	}
+
+	if (_globals[kFlickedLever2]) {
+		Common::Point pos;
+		int type;
+
+		getLeverInfo(&pos, &type, _globals[kFlickedLever2], NULL);
+		int stampType = -1;
+		switch (type) {
+		case 1:
+			stampType = _globals._spriteIndexes[0];
+			break;
+
+		case 2:
+			stampType = _globals._spriteIndexes[1];
+			break;
+
+		case 3:
+			stampType = _globals._spriteIndexes[2];
+			break;
+
+		default:
+			break;
+		}
+		_scene->deleteSequence(_skullSequence[_globals[kFlickedLever2] - 1]);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, -2);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+	}
+
+	if (_globals[kFlickedLever3]) {
+		Common::Point pos;
+		int type;
+
+		getLeverInfo(&pos, &type, _globals[kFlickedLever3], NULL);
+		int stampType = -1;
+		switch (type) {
+		case 1:
+			stampType = _globals._spriteIndexes[0];
+			break;
+
+		case 2:
+			stampType = _globals._spriteIndexes[1];
+			break;
+
+		case 3:
+			stampType = _globals._spriteIndexes[2];
+			break;
+
+		default:
+			break;
+		}
+		_scene->deleteSequence(_skullSequence[_globals[kFlickedLever3] - 1]);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, -2);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+	}
+
+	if (_globals[kFlickedLever4]) {
+		Common::Point pos;
+		int type;
+
+		getLeverInfo(&pos, &type, _globals[kFlickedLever4], NULL);
+		int stampType = -1;
+		switch (type) {
+		case 1:
+			stampType = _globals._spriteIndexes[0];
+			break;
+
+		case 2:
+			stampType = _globals._spriteIndexes[1];
+			break;
+
+		case 3:
+			stampType = _globals._spriteIndexes[2];
+			break;
+
+		default:
+			break;
+		}
+		_scene->deleteSequence(_skullSequence[_globals[kFlickedLever4] - 1]);
+		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, -2);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene410::step() {
+}
+
+void Scene410::actions() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(41013);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) {
+		if (_globals[kDoorIn409IsOpen])
+			_vm->_dialogs->show(41014);
+		else {
+			Common::Point pos;
+			int type;
+			int number;
+
+			switch (_game._trigger) {
+			case 0:
+				_game._player._stepEnabled = false;
+				getLeverInfo(&pos, &type, 0, &number);
+				_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 4, 2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+				if (pos.y == 46)
+					pos.y = 48;
+
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(pos.x + 4, pos.y + 107));
+				if (!_globals[kDoorIn409IsOpen])
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 16, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 2);
+				break;
+
+			case 1:
+				getLeverInfo(&pos, &type, 0, &number);
+
+				if ((_globals[kFlickedLever1] != number) && (_globals[kFlickedLever2] != number) && (_globals[kFlickedLever3] != number) && (_globals[kFlickedLever4] != number)) {
+					_vm->_sound->command(65);
+
+					if (!_globals[kFlickedLever1]) {
+						_globals[kFlickedLever1] = number;
+						if (_globals[kFlickedLever1] == 5)
+							_vm->_sound->command(66);
+					} else if (!_globals[kFlickedLever2]) {
+						_globals[kFlickedLever2] = number;
+						if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18))
+							_vm->_sound->command(66);
+					} else if (!_globals[kFlickedLever3]) {
+						_globals[kFlickedLever3] = number;
+						if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18) && (_globals[kFlickedLever3] == 9))
+							_vm->_sound->command(66);
+					} else if (!_globals[kFlickedLever4]) {
+						_globals[kFlickedLever4] = number;
+						if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18) && (_globals[kFlickedLever3] == 9) && (_globals[kFlickedLever4] == 11))
+							_vm->_sound->command(66);
+					}
+
+					if (_game._difficulty == DIFFICULTY_EASY)
+						_scene->drawToBackground(_globals._spriteIndexes[4], number, Common::Point(-32000, -32000), 0, 100);
+
+					switch (type) {
+					case 1:
+						_scene->deleteSequence(_skullSequence[number - 1]);
+						_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+						_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 4);
+						_scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos);
+						break;
+
+					case 2:
+						_scene->deleteSequence(_skullSequence[number - 1]);
+						_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+						_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 4);
+						_scene->_sequences.setPosition(_globals._sequenceIndexes[1], pos);
+						break;
+
+					case 3:
+						_scene->deleteSequence(_skullSequence[number - 1]);
+						_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+						_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 4);
+						_scene->_sequences.setPosition(_globals._sequenceIndexes[2], pos);
+						break;
+
+					default:
+						break;
+					}
+				}
+				break;
+
+			case 2:
+				_game._player._stepEnabled = true;
+
+				if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18) && (_globals[kFlickedLever3] == 9) && (_globals[kFlickedLever4] == 11) && !_globals[kDoorIn409IsOpen])
+					_vm->_sound->command(67);
+
+				if (_globals[kFlickedLever1] && _globals[kFlickedLever2] && _globals[kFlickedLever3] && _globals[kFlickedLever4])
+					_scene->_nextSceneId = 409;
+
+				break;
+
+			case 4:
+				getLeverInfo(&pos, &type, 0, &number);
+				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos);
+				break;
+
+			case 5:
+				getLeverInfo(&pos, &type, 0, &number);
+				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[1], pos);
+				break;
+
+			case 6:
+				getLeverInfo(&pos, &type, 0, &number);
+				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+				_scene->_sequences.setPosition(_globals._sequenceIndexes[2], pos);
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(41011);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SWITCH_PANEL)) {
+			_vm->_dialogs->show(41011);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CATACOMB_ROOM)) {
+			_vm->_dialogs->show(41015);
+			_action._inProgress = false;
+			return;
+		}
+
+		switch (_action._activeAction._objectNameId) {
+		case NOUN_SKULL_SWITCH_1:
+		case NOUN_SKULL_SWITCH_2:
+		case NOUN_SKULL_SWITCH_3:
+		case NOUN_SKULL_SWITCH_4:
+		case NOUN_SKULL_SWITCH_5:
+		case NOUN_SKULL_SWITCH_6:
+		case NOUN_SKULL_SWITCH_7:
+		case NOUN_SKULL_SWITCH_8:
+		case NOUN_SKULL_SWITCH_9:
+		case NOUN_SKULL_SWITCH_10:
+		case NOUN_SKULL_SWITCH_11:
+		case NOUN_SKULL_SWITCH_12:
+		case NOUN_SKULL_SWITCH_13:
+		case NOUN_SKULL_SWITCH_14:
+		case NOUN_SKULL_SWITCH_15:
+		case NOUN_SKULL_SWITCH_16:
+		case NOUN_SKULL_SWITCH_17:
+		case NOUN_SKULL_SWITCH_18:
+		case NOUN_SKULL_SWITCH_19:
+		case NOUN_SKULL_SWITCH_20:
+		case NOUN_SKULL_SWITCH_21:
+		case NOUN_SKULL_SWITCH_22:
+		case NOUN_SKULL_SWITCH_23:
+		case NOUN_SKULL_SWITCH_24:
+		case NOUN_SKULL_SWITCH_25:
+		case NOUN_SKULL_SWITCH_26:
+			_vm->_dialogs->show(41012);
+			_action._inProgress = false;
+			return;
+			break;
+		}
+	}
+
+	if (_action.isAction(VERB_EXIT_TO, NOUN_CATACOMB_ROOM)) {
+		_scene->_nextSceneId = 409;
+		_action._inProgress = false;
+	}
+}
+
+void Scene410::preActions() {
+}
+
+void Scene410::getLeverInfo(Common::Point *pos, int *type, int lever, int *noun) {
+	if (noun != NULL) {
+		switch (_action._activeAction._objectNameId) {
+		case NOUN_SKULL_SWITCH_1:
+			lever = 1;
+			break;
+
+		case NOUN_SKULL_SWITCH_2:
+			lever = 2;
+			break;
+
+		case NOUN_SKULL_SWITCH_3:
+			lever = 3;
+			break;
+
+		case NOUN_SKULL_SWITCH_4:
+			lever = 4;
+			break;
+
+		case NOUN_SKULL_SWITCH_5:
+			lever = 5;
+			break;
+
+		case NOUN_SKULL_SWITCH_6:
+			lever = 6;
+			break;
+
+		case NOUN_SKULL_SWITCH_7:
+			lever = 7;
+			break;
+
+		case NOUN_SKULL_SWITCH_8:
+			lever = 8;
+			break;
+
+		case NOUN_SKULL_SWITCH_9:
+			lever = 9;
+			break;
+
+		case NOUN_SKULL_SWITCH_10:
+			lever = 10;
+			break;
+
+		case NOUN_SKULL_SWITCH_11:
+			lever = 11;
+			break;
+
+		case NOUN_SKULL_SWITCH_12:
+			lever = 12;
+			break;
+
+		case NOUN_SKULL_SWITCH_13:
+			lever = 13;
+			break;
+
+		case NOUN_SKULL_SWITCH_14:
+			lever = 14;
+			break;
+
+		case NOUN_SKULL_SWITCH_15:
+			lever = 15;
+			break;
+
+		case NOUN_SKULL_SWITCH_16:
+			lever = 16;
+			break;
+
+		case NOUN_SKULL_SWITCH_17:
+			lever = 17;
+			break;
+
+		case NOUN_SKULL_SWITCH_18:
+			lever = 18;
+			break;
+
+		case NOUN_SKULL_SWITCH_19:
+			lever = 19;
+			break;
+
+		case NOUN_SKULL_SWITCH_20:
+			lever = 20;
+			break;
+
+		case NOUN_SKULL_SWITCH_21:
+			lever = 21;
+			break;
+
+		case NOUN_SKULL_SWITCH_22:
+			lever = 22;
+			break;
+
+		case NOUN_SKULL_SWITCH_23:
+			lever = 23;
+			break;
+
+		case NOUN_SKULL_SWITCH_24:
+			lever = 24;
+			break;
+
+		case NOUN_SKULL_SWITCH_25:
+			lever = 25;
+			break;
+
+		case NOUN_SKULL_SWITCH_26:
+			lever = 26;
+			break;
+
+		default:
+			break;
+		}
+		*noun = lever;
+	}
+
+	switch (lever) {
+	case 1:
+		*pos = Common::Point(124, 46);
+		*type = 3;
+		break;
+
+	case 2:
+		*pos = Common::Point(143, 46);
+		*type = 2;
+		break;
+
+	case 3:
+		*pos = Common::Point(162, 46);
+		*type = 1;
+		break;
+
+	case 4:
+		*pos = Common::Point(181, 46);
+		*type = 3;
+		break;
+
+	case 5:
+		*pos = Common::Point(200, 46);
+		*type = 1;
+		break;
+
+	case 6:
+		*pos = Common::Point(219, 46);
+		*type = 2;
+		break;
+
+	case 7:
+		*pos = Common::Point(238, 46);
+		*type = 1;
+		break;
+
+	case 8:
+		*pos = Common::Point(133, 71);
+		*type = 3;
+		break;
+
+	case 9:
+		*pos = Common::Point(152, 71);
+		*type = 2;
+		break;
+
+	case 10:
+		*pos = Common::Point(171, 71);
+		*type = 1;
+		break;
+
+	case 11:
+		*pos = Common::Point(190, 71);
+		*type = 3;
+		break;
+
+	case 12:
+		*pos = Common::Point(209, 71);
+		*type = 2;
+		break;
+
+	case 13:
+		*pos = Common::Point(228, 71);
+		*type = 1;
+		break;
+
+	case 14:
+		*pos = Common::Point(124, 98);
+		*type = 1;
+		break;
+
+	case 15:
+		*pos = Common::Point(143, 98);
+		*type = 3;
+		break;
+
+	case 16:
+		*pos = Common::Point(162, 98);
+		*type = 2;
+		break;
+
+	case 17:
+		*pos = Common::Point(181, 98);
+		*type = 1;
+		break;
+
+	case 18:
+		*pos = Common::Point(200, 98);
+		*type = 1;
+		break;
+
+	case 19:
+		*pos = Common::Point(219, 98);
+		*type = 2;
+		break;
+
+	case 20:
+		*pos = Common::Point(238, 98);
+		*type = 1;
+		break;
+
+	case 21:
+		*pos = Common::Point(133, 125);
+		*type = 3;
+		break;
+
+	case 22:
+		*pos = Common::Point(152, 125);
+		*type = 1;
+		break;
+
+	case 23:
+		*pos = Common::Point(171, 125);
+		*type = 3;
+		break;
+
+	case 24:
+		*pos = Common::Point(190, 125);
+		*type = 2;
+		break;
+
+	case 25:
+		*pos = Common::Point(209, 125);
+		*type = 1;
+		break;
+
+	case 26:
+		*pos = Common::Point(228, 125);
+		*type = 2;
+		break;
+
+	default:
+		*pos = Common::Point(-1, -1);
+		*type = -1;
+		break;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index 0de833f..249d1d1 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -202,6 +202,21 @@ public:
 	virtual void actions();
 };
 
+class Scene410 : public Scene4xx {
+private:
+	int _skullSequence[26];
+	void getLeverInfo(Common::Point *pos, int *type, int lever_number, int *noun);
+
+public:
+	Scene410(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: f94b5473b14d9c680cd7ae234e5e88909935fa1d
    https://github.com/scummvm/scummvm/commit/f94b5473b14d9c680cd7ae234e5e88909935fa1d
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-02T22:13:18+01:00

Commit Message:
MADS: Phantom: Implement scene 453

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 6de2461..8049909 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -136,7 +136,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 410:	// skull switch panel
 		return new Scene410(vm);
 	case 453:	// Labyrinth room (big), 4 exits + 1 bricked door, right
-		return new DummyScene(vm);	// TODO
+		return new Scene453(vm);
 	case 456:	// Labyrinth room, 2 exits
 		return new DummyScene(vm);	// TODO
 
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 1f3d2da..bcd87ae 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -2510,9 +2510,9 @@ void Scene408::enter() {
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
-		_globals._spriteIndexes[8] = _scene->_sprites.addSprites (formAnimName('x', -1), false);
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('x', -1), false);
 		if (!_globals[kCobwebIsCut]) {
-			_globals._spriteIndexes[6] = _scene->_sprites.addSprites (formAnimName('c', 1), false);
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
 			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10);
 			_scene->_hotspots.activate(NOUN_COBWEB, true);
@@ -2533,7 +2533,7 @@ void Scene408::enter() {
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites (formAnimName('c', 2), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
 		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_EXPOSED_BRICK, false);
 	}
@@ -4125,5 +4125,493 @@ void Scene410::getLeverInfo(Common::Point *pos, int *type, int lever, int *noun)
 
 /*------------------------------------------------------------------------*/
 
+Scene453::Scene453(MADSEngine *vm) : Scene4xx(vm) {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHotspotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene453::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHotspotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene453::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_STONE)
+		_scene->_initialVariant = 1;
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene453::enter() {
+	_game.initCatacombs();
+
+	_scene->_hotspots.activate(NOUN_SKULL, false);
+	_scene->_hotspots.activate(NOUN_DRAIN, false);
+	_scene->_hotspots.activate(NOUN_RATS_NEST, false);
+	_scene->_hotspots.activate(NOUN_WEB, false);
+	_scene->_hotspots.activate(NOUN_STONE, false);
+	_scene->_hotspots.activate(NOUN_HOLE, false);
+	_scene->_hotspots.activate(NOUN_GATE, false);
+
+	_globals._spriteIndexes[8]  = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[9]    = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[10]  = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[11]   = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+
+
+	if (_game.exitCatacombs(0) == -1) {
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
+	}
+
+	if (_game.exitCatacombs(3) == -1) {
+		_globals._spriteIndexes[13]  = _scene->_sprites.addSprites(formAnimName('c', 8), false);
+		_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
+		_scene->_hotspots.activate(NOUN_GATE, true);
+	}
+
+	if (_game.exitCatacombs(1) == -1) {
+		_globals._spriteIndexes[2]  = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_DRAIN) {
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3), false);
+		_scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_DRAIN, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4), false);
+		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_SKULL, true);
+		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5), false);
+		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_WEB, true);
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 6), false);
+		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(138, 35));
+		_scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(84, 27));
+	}
+
+	if (_globals[kCatacombsMisc] & MAZE_EVENT_STONE) {
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7), false);
+		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_HOLE, true);
+		_scene->_hotspots.activate(NOUN_STONE, true);
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 0:
+			_game._player._playerPos = Common::Point(107, 87);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(107, 98), FACING_SOUTH);
+			break;
+
+		case 1:
+			_game._player._playerPos = Common::Point(316, 129);
+			_game._player._facing = FACING_WEST;
+			_game._player.walk(Common::Point(277, 129), FACING_WEST);
+			break;
+
+		case 3:
+			_game._player.firstWalk(Common::Point(-20, 128), FACING_EAST, Common::Point(19, 128), FACING_EAST, true);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene453::step() {
+}
+
+void Scene453::actions() {
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) { 
+			if (_frameInRoomFl)
+				_vm->_dialogs->show(29);
+			else {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled  = false;
+					_game._player._visible     = false;  
+					_globals._sequenceIndexes[8]      = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+					break;
+
+				case 1:
+					if (_action.isObject(NOUN_RED_FRAME)) {
+						_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+						_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+						_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_GREEN_FRAME)) {
+						_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+						_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+						_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_BLUE_FRAME)) {
+						_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+						_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+						_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_YELLOW_FRAME)) {
+						_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+						_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+						_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+					break;
+
+				case 2:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
+					_game._player._visible    = true;
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE)) {
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) {
+			if ((_takingFrameInRoomFl || _game._trigger)) {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled  = false;
+					_game._player._visible     = false;  
+					_globals._sequenceIndexes[8]      = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+					break;
+
+				case 1:
+					if (_action.isObject(NOUN_RED_FRAME)) {
+						_scene->deleteSequence(_globals._sequenceIndexes[9]);
+						_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+						_game._objects.addToInventory(OBJ_RED_FRAME);
+					}
+
+					if (_action.isObject(NOUN_GREEN_FRAME)) {
+						_scene->deleteSequence(_globals._sequenceIndexes[10]);
+						_scene->_dynamicHotspots.remove(_greenFrameHotspotId);
+						_game._objects.addToInventory(OBJ_GREEN_FRAME);
+					}
+
+					if (_action.isObject(NOUN_BLUE_FRAME)) {
+						_scene->deleteSequence(_globals._sequenceIndexes[11]);
+						_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+						_game._objects.addToInventory(OBJ_BLUE_FRAME);
+					}
+
+					if (_action.isObject(NOUN_YELLOW_FRAME)) {
+						_scene->deleteSequence(_globals._sequenceIndexes[12]);
+						_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+						_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+					}
+
+					_vm->_sound->command(26);
+					break;
+
+				case 2:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
+					_game._player._visible    = true;
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+				_action._inProgress = false;
+				return;
+			}
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) {
+		_game.moveCatacombs(0);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) {
+		_game.moveCatacombs(1);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(45310);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(45311);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(45312);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(45313);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(45314);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_HOLE)) {
+			_vm->_dialogs->show(45317);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SKULL)) {
+			_vm->_dialogs->show(45318);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WEB)) {
+			_vm->_dialogs->show(45324);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RATS_NEST)) {
+			_vm->_dialogs->show(45325);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DRAIN)) {
+			_vm->_dialogs->show(45327);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_STONE)) {
+			_vm->_dialogs->show(45328);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(45315);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GATE)) {
+			_vm->_dialogs->show(45330);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_SKULL)) {
+		_vm->_dialogs->show(45319);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_GATE)) {
+		_vm->_dialogs->show(45331);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) {
+		_vm->_dialogs->show(45326);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_STONE)) {
+		_vm->_dialogs->show(45329);
+		_action._inProgress = false;
+	}
+}
+
+void Scene453::preActions() {
+	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS))
+		_game.moveCatacombs(3);
+
+	_frameInRoomFl         = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { 
+		if (_frameInRoomFl)
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0);
+			_game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+		}
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index 249d1d1..970526b 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -217,6 +217,27 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene453 : public Scene4xx {
+private:
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHotspotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene453(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 1eaf7c13e02854ab3c12867f2fed571a1f71ea54
    https://github.com/scummvm/scummvm/commit/1eaf7c13e02854ab3c12867f2fed571a1f71ea54
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-02T22:15:38+01:00

Commit Message:
MADS: Phantom: Janitorial - Remove extra spaces

Changed paths:
    engines/mads/phantom/phantom_scenes4.cpp



diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index bcd87ae..3ddebb0 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -4171,10 +4171,10 @@ void Scene453::enter() {
 	_scene->_hotspots.activate(NOUN_HOLE, false);
 	_scene->_hotspots.activate(NOUN_GATE, false);
 
-	_globals._spriteIndexes[8]  = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[9]    = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[10]  = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[11]   = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
 	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
 
 
@@ -4185,14 +4185,14 @@ void Scene453::enter() {
 	}
 
 	if (_game.exitCatacombs(3) == -1) {
-		_globals._spriteIndexes[13]  = _scene->_sprites.addSprites(formAnimName('c', 8), false);
+		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 8), false);
 		_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
 		_scene->_hotspots.activate(NOUN_GATE, true);
 	}
 
 	if (_game.exitCatacombs(1) == -1) {
-		_globals._spriteIndexes[2]  = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
 		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false);
 	}
@@ -4297,15 +4297,15 @@ void Scene453::step() {
 
 void Scene453::actions() {
 	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) {
-		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) { 
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) {
 			if (_frameInRoomFl)
 				_vm->_dialogs->show(29);
 			else {
 				switch (_game._trigger) {
 				case (0):
-					_game._player._stepEnabled  = false;
-					_game._player._visible     = false;  
-					_globals._sequenceIndexes[8]      = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
 					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
@@ -4359,8 +4359,8 @@ void Scene453::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
-					_game._player._visible    = true;
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
 
@@ -4378,9 +4378,9 @@ void Scene453::actions() {
 			if ((_takingFrameInRoomFl || _game._trigger)) {
 				switch (_game._trigger) {
 				case (0):
-					_game._player._stepEnabled  = false;
-					_game._player._visible     = false;  
-					_globals._sequenceIndexes[8]      = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
 					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
@@ -4416,8 +4416,8 @@ void Scene453::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); 
-					_game._player._visible    = true;
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
 
@@ -4574,7 +4574,7 @@ void Scene453::preActions() {
 	if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS))
 		_game.moveCatacombs(3);
 
-	_frameInRoomFl         = false;
+	_frameInRoomFl = false;
 	_takingFrameInRoomFl = false;
 
 	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
@@ -4601,7 +4601,7 @@ void Scene453::preActions() {
 			_takingFrameInRoomFl = true;
 	}
 
-	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { 
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
 		if (_frameInRoomFl)
 			_game._player._needToWalk = false;
 		else {


Commit: 9e675155b0cd72d12cf944dcff46e34150cfb4f5
    https://github.com/scummvm/scummvm/commit/9e675155b0cd72d12cf944dcff46e34150cfb4f5
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-03T00:09:39+01:00

Commit Message:
MADS: Phantom: Implement scene 456

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 8049909..b4d4f46 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -138,7 +138,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 453:	// Labyrinth room (big), 4 exits + 1 bricked door, right
 		return new Scene453(vm);
 	case 456:	// Labyrinth room, 2 exits
-		return new DummyScene(vm);	// TODO
+		return new Scene456(vm);
 
 	// Scene group #5 (Phantom's hideout)
 	case 501:	// catacombs, outside phantom's hideout, lake and boat
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 3ddebb0..cdecc11 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -4613,5 +4613,363 @@ void Scene453::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene456::Scene456(MADSEngine *vm) : Scene4xx(vm) {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	_redFrameHotspotId = -1;
+	_greenFrameHotspotId = -1;
+	_blueFrameHotspotId = -1;
+	_yellowFrameHotspotId = -1;
+}
+
+void Scene456::synchronize(Common::Serializer &s) {
+	Scene4xx::synchronize(s);
+
+	s.syncAsByte(_frameInRoomFl);
+	s.syncAsByte(_takingFrameInRoomFl);
+
+	s.syncAsSint16LE(_redFrameHotspotId);
+	s.syncAsSint16LE(_greenFrameHotspotId);
+	s.syncAsSint16LE(_blueFrameHotspotId);
+	s.syncAsSint16LE(_yellowFrameHotspotId);
+}
+
+void Scene456::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_RED_FRAME);
+	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
+	_scene->addActiveVocab(NOUN_BLUE_FRAME);
+	_scene->addActiveVocab(NOUN_GREEN_FRAME);
+}
+
+void Scene456::enter() {
+	_game.initCatacombs();
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+
+	if (_game.exitCatacombs(1) == -1) {
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false);
+	}
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		switch (_globals[kCatacombsFrom]) {
+		case 1:
+			_game._player._playerPos = Common::Point(298, 123);
+			_game._player._facing = FACING_WEST;
+			_game._player.walk(Common::Point(254, 123), FACING_WEST);
+			break;
+
+		case 3:
+			_game._player._playerPos = Common::Point(14, 117);
+			_game._player._facing = FACING_SOUTH;
+			_game._player.walk(Common::Point(46, 117), FACING_EAST);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+		_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+		_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+		_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+
+		Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+		_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+		_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene456::step() {
+}
+
+void Scene456::actions() {
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) {
+		if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) {
+			if (_frameInRoomFl) {
+				_vm->_dialogs->show(29);
+			} else {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+					break;
+
+				case 1:
+					if (_action.isObject(NOUN_RED_FRAME)) {
+						_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
+						_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+						_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_GREEN_FRAME)) {
+						_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
+						_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+						_greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_BLUE_FRAME)) {
+						_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
+						_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+						_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+
+					if (_action.isObject(NOUN_YELLOW_FRAME)) {
+						_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
+						_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
+						_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+						_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+
+						Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+						_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
+						_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+					}
+					break;
+
+				case 2:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+					_game._player._visible = true;
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+
+	if (_action.isAction(VERB_TAKE)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) {
+		if ((_takingFrameInRoomFl || _game._trigger)) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+				break;
+
+			case 1:
+				if (_action.isObject(NOUN_RED_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[2]);
+					_scene->_dynamicHotspots.remove(_redFrameHotspotId);
+					_game._objects.addToInventory(OBJ_RED_FRAME);
+				}
+
+				if (_action.isObject(NOUN_GREEN_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[3]);
+					_scene->_dynamicHotspots.remove(_greenFrameHotspotId);
+					_game._objects.addToInventory(OBJ_GREEN_FRAME);
+				}
+
+				if (_action.isObject(NOUN_BLUE_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[4]);
+					_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
+					_game._objects.addToInventory(OBJ_BLUE_FRAME);
+				}
+
+				if (_action.isObject(NOUN_YELLOW_FRAME)) {
+					_scene->deleteSequence(_globals._sequenceIndexes[5]);
+					_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
+					_game._objects.addToInventory(OBJ_YELLOW_FRAME);
+				}
+
+				_vm->_sound->command(26);
+				break;
+
+			case 2:
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) {
+		_game.moveCatacombs(3);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) {
+		_game.moveCatacombs(1);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(45610);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(45611);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(45612);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY)) {
+			_vm->_dialogs->show(45613);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_EXPOSED_BRICK)) {
+			_vm->_dialogs->show(45614);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
+			_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MORE_CATACOMBS)) {
+			_vm->_dialogs->show(45615);
+			_action._inProgress = false;
+		}
+	}
+}
+
+void Scene456::preActions() {
+	_frameInRoomFl = false;
+	_takingFrameInRoomFl = false;
+
+	if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
+		_frameInRoomFl = true;
+		if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
+			_takingFrameInRoomFl = true;
+	}
+
+	if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
+	 && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
+		if (_frameInRoomFl)
+			_game._player._needToWalk = false;
+		else {
+			Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0);
+			_game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
+		}
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index 970526b..ed35d77 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -238,6 +238,27 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene456 : public Scene4xx {
+private:
+	bool _frameInRoomFl;
+	bool _takingFrameInRoomFl;
+
+	int _redFrameHotspotId;
+	int _greenFrameHotspotId;
+	int _blueFrameHotspotId;
+	int _yellowFrameHotspotId;
+
+public:
+	Scene456(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 04868be95b617bb64e0e468eeb16915af19993f8
    https://github.com/scummvm/scummvm/commit/04868be95b617bb64e0e468eeb16915af19993f8
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-03T21:32:18+01:00

Commit Message:
MADS: Phantom: Implement setupCatacombs

Changed paths:
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h
    engines/mads/phantom/globals_phantom.cpp



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 47e09da..c73ba24 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -35,8 +35,107 @@ namespace MADS {
 
 namespace Phantom {
 
-GamePhantom::GamePhantom(MADSEngine *vm)
-	: Game(vm) {
+	Catacombs easy_catacombs[32] = {
+		{ 401, { -1,  1,  2,  6 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 404, { 10, 11,  3,  0 }, { 2, 3, 0, 1 }, MAZE_EVENT_PUDDLE },
+		{ 404, {  0,  3,  4, -2 }, { 2, 3, 0, 1 }, MAZE_EVENT_BLOCK },
+		{ 401, {  1, 14,  5,  2 }, { 2, 3, 0, 1 }, MAZE_EVENT_POT },
+		{ 453, {  2,  4, -1,  4 }, { 2, 3, 0, 1 }, MAZE_EVENT_DRAIN },
+		{ 403, {  3,  6, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_PLANK },
+		{ 406, { -1,  0, -1,  5 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 453, { -1,  8, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 406, { -1,  9, -1,  7 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 401, {  1, -1, 10,  8 }, { 2, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_SKULL },
+		{ 408, {  9, -1,  1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 453, { 12, -1, -1,  1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_STONE },
+		{ 408, { 13, -1, 11, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 401, { 13, 20, 12, 13 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK },
+		{ 453, { 16, 15, -1,  3 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_RAT_NEST },
+		{ 456, { -1, -1, -1, 14 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 404, { -1, 17, 14, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_POT },
+		{ 401, { 18, -1, 19, 16 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 408, { -1, -1, 17, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 403, { 17, -1, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB },
+		{ 403, { 21, 22, -1, 13 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_SKULL },
+		{ 404, { -1, -1, 20, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 406, { -1, 23, -1, 20 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 404, { 24, 23, 23, 22 }, { 2, 2, 1, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK },
+		{ 401, { -1,  1, 23, 25 }, { 2, 1, 0, 1 }, MAZE_EVENT_PUDDLE | MAZE_EVENT_POT | MAZE_EVENT_BRICK },
+		{ 407, { 29, 24, 28, 26 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE },
+		{ 401, { 27, 25, 23, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL },
+		{ 404, { -1, 28, 26, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_FALLEN_BLOCK },
+		{ 456, { -1, 25, -1, 27 }, { 2, 2, 0, 1 }, MAZE_EVENT_NONE },
+		{ 406, { -1, 30, -1, 25 }, { 2, 3, 0, 0 }, MAZE_EVENT_NONE },
+		{ 453, { -3, 30, -1, 29 }, { 2, 3, 0, 1 }, MAZE_EVENT_STONE | MAZE_EVENT_RAT_NEST | MAZE_EVENT_WEB },
+		{ 408, { -5, -1, -4, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_BRICK }
+	};
+
+	Catacombs hard_catacombs[62] = {
+		{ 401, { -1,  1,  2,  6 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 404, { 10, 11,  3,  0 }, { 2, 3, 0, 1 }, MAZE_EVENT_PUDDLE },
+		{ 404, {  0,  3,  4, -2 }, { 2, 3, 0, 1 }, MAZE_EVENT_BLOCK },
+		{ 401, {  1, 20,  5,  2 }, { 2, 0, 0, 1 }, MAZE_EVENT_POT },
+		{ 453, {  2,  4, -1,  4 }, { 2, 3, 0, 1 }, MAZE_EVENT_DRAIN },
+		{ 403, {  3,  6, -1,  4 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_PLANK },
+		{ 406, { -1,  0, -1,  5 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 453, { -1,  8, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 406, { -1,  9, -1,  7 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 401, {  1, -1, 10,  8 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_SKULL },
+		{ 408, {  9, -1,  1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 453, { 12, -1, -1,  1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_STONE },
+		{ 408, { 13, -1, 11, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 401, { 13, 21, 12, 13 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK },
+		{ 453, { 16, 15, -1, 20 }, { 2, 3, 0, 2 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK },
+		{ 456, { -1, -1, -1, 14 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 404, { -1, 17, 14, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_POT },
+		{ 401, { 18, -1, 19, 16 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 408, { -1, -1, 17, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 403, { 17, -1, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB },
+		{ 408, {  3, -1, 14, -1 }, { 1, 3, 3, 1 }, MAZE_EVENT_NONE },
+		{ 404, {  9, 30, 22, 13 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST },
+		{ 403, { 21, 23, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB },
+		{ 401, { -1, -1, 24, 22 }, { 2, 3, 3, 1 }, MAZE_EVENT_BRICK },
+		{ 406, { -1, 26, -1, 23 }, { 2, 0, 0, 2 }, MAZE_EVENT_NONE },
+		{ 407, { 36, 33, 35, 34 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE },
+		{ 453, { 24, 27, -1, -1 }, { 1, 0, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 403, { 26, -1, -1, 28 }, { 1, 3, 0, 0 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL },
+		{ 404, { 27, 28, 28, 29 }, { 3, 2, 1, 2 }, MAZE_EVENT_NONE },
+		{ 408, { -1, -1, 28, -1 }, { 2, 3, 3, 1 }, MAZE_EVENT_BRICK },
+		{ 406, { -1, 31, -1, 21 }, { 2, 0, 0, 1 }, MAZE_EVENT_NONE },
+		{ 401, { 30, 33,  1, -1 }, { 1, 2, 1, 1 }, MAZE_EVENT_PUDDLE | MAZE_EVENT_POT },
+		{ 456, { -1, 31, -1, 33 }, { 2, 1, 0, 0 }, MAZE_EVENT_NONE },
+		{ 404, { 32, -1, 31, 25 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE },
+		{ 401, { 46, 25, 31, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL },
+		{ 401, { -1, 25, 41, -1 }, { 2, 2, 1, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_POT },
+		{ 406, { -1, 37, -1, 25 }, { 2, 3, 0, 0 }, MAZE_EVENT_NONE },
+		{ 453, { -3, 37, -1, 36 }, { 2, 3, 0, 1 }, MAZE_EVENT_STONE | MAZE_EVENT_RAT_NEST | MAZE_EVENT_WEB },
+		{ 408, { 57, -1, 54, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 408, { 40, -1, -4, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_WEB },
+		{ 404, { 40, 40, 39, 53 }, { 1, 0, 0, 1 }, MAZE_EVENT_BLOCK | MAZE_EVENT_FALLEN_BLOCK },
+		{ 456, { -1, 35, -1, 42 }, { 2, 2, 0, 2 }, MAZE_EVENT_NONE },
+		{ 408, { 43, -1, 41, -1 }, { 1, 3, 3, 1 }, MAZE_EVENT_BRICK },
+		{ 406, { -1, 42, -1, 61 }, { 2, 0, 0, 1 }, MAZE_EVENT_NONE },
+		{ 403, { 58, 45, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_RAT_NEST },
+		{ 401, { 34, -1, 46, 44 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK },
+		{ 404, { 45, -1, 34, 47 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_FALLEN_BLOCK },
+		{ 406, { -1, 46, -1, 48 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 403, { 49, 47, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL | MAZE_EVENT_WEB },
+		{ 408, { 50, -1, 48, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 408, { 51, -1, 49, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 408, { 52, -1, 50, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 408, { -1, -1, 51, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
+		{ 406, { -1, 40, -1, 54 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 403, { 38, 53, -1, 55 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL },
+		{ 453, { 56, 54, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_WEB },
+		{ 401, { 56, -5, 55, 56 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL },
+		{ 404, { -1, 57, 38, 57 }, { 2, 3, 0, 1 }, MAZE_EVENT_POT | MAZE_EVENT_BLOCK },
+		{ 404, { 59, 59, 44, 60 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 404, { 59, 60, 59, 58 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 404, { 61, 58, 59, 59 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE },
+		{ 404, { 34, 43, 60, 44 }, { 0, 3, 0, 1 }, MAZE_EVENT_NONE }
+	};
+
+GamePhantom::GamePhantom(MADSEngine *vm) : Game(vm) {
 	_surface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
 	_storyMode = STORYMODE_NAUGHTY;
 	_difficulty = DIFFICULTY_HARD;
@@ -52,8 +151,7 @@ void GamePhantom::startGame() {
 
 void GamePhantom::initializeGlobals() {
 	_globals.reset();
-
-	// TODO: Catacombs setup
+	setupCatacombs();
 
 	_player._facing = FACING_NORTH;
 	_player._turnToFacing = FACING_NORTH;
@@ -201,6 +299,37 @@ void GamePhantom::enterCatacombs(int val) {
 void GamePhantom::initCatacombs() {
 	warning("TODO: initCatacombs");
 }
+
+void GamePhantom::setupCatacombs() {
+	switch (_difficulty) {
+	case DIFFICULTY_EASY:
+		catacombs = easy_catacombs;
+
+		_globals[kCatacombs309]      = 2;
+		_globals[kCatacombs309From]  = 3;
+		_globals[kCatacombs409a]     = 30;
+		_globals[kCatacombs409aFrom] = 0;
+		_globals[kCatacombs409b]     = 31;
+		_globals[kCatacombs409bFrom] = 2;
+		_globals[kCatacombs501]      = 31;
+		_globals[kCatacombs501From]  = 0;
+		break;
+
+	case DIFFICULTY_HARD:
+		catacombs = hard_catacombs;
+
+		_globals[kCatacombs309]      = 2;
+		_globals[kCatacombs309From]  = 3;
+		_globals[kCatacombs409a]     = 37;
+		_globals[kCatacombs409aFrom] = 0;
+		_globals[kCatacombs409b]     = 39;
+		_globals[kCatacombs409bFrom] = 2;
+		_globals[kCatacombs501]      = 56;
+		_globals[kCatacombs501From]  = 1;
+		break;
+	}
+}
+
 } // End of namespace Phantom
 
 } // End of namespace MADS
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index d6de29b..1ba8ade 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -69,6 +69,7 @@ enum InventoryObject {
 };
 
 enum MazeEvent {
+	MAZE_EVENT_NONE = 0,
 	MAZE_EVENT_PUDDLE = 0x0001,
 	MAZE_EVENT_RAT_NEST = 0x0002,
 	MAZE_EVENT_SKULL = 0x0004,
@@ -83,8 +84,19 @@ enum MazeEvent {
 	MAZE_EVENT_FALLEN_BLOCK = 0x0800
 };
 
+struct Catacombs {
+	int _sceneNum;
+	int _exit[4];
+	int _fromDirection[4];
+	int _flags;
+};
+
 class GamePhantom : public Game {
 	friend class Game;
+
+private:
+	Catacombs *catacombs;
+
 protected:
 	GamePhantom(MADSEngine *vm);
 
@@ -111,6 +123,7 @@ public:
 
 	virtual void synchronize(Common::Serializer &s, bool phase1);
 
+	void setupCatacombs();
 	void enterCatacombs(int val);
 	void initCatacombs();
 	void moveCatacombs(int dir) { warning("TODO: moveCataCombs"); };
diff --git a/engines/mads/phantom/globals_phantom.cpp b/engines/mads/phantom/globals_phantom.cpp
index dd3bd84..eea8476 100644
--- a/engines/mads/phantom/globals_phantom.cpp
+++ b/engines/mads/phantom/globals_phantom.cpp
@@ -28,8 +28,7 @@ namespace MADS {
 
 namespace Phantom {
 
-PhantomGlobals::PhantomGlobals()
-	: Globals() {
+PhantomGlobals::PhantomGlobals() : Globals() {
 	// Initialize lists
 	resize(210);
 	_spriteIndexes.resize(30);


Commit: 9d6bb85ce3e42e30f1d539a5f2c7a8d7de3b15a1
    https://github.com/scummvm/scummvm/commit/9d6bb85ce3e42e30f1d539a5f2c7a8d7de3b15a1
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-03T23:07:47+01:00

Commit Message:
MADS: Phantom: Implement exitCatacombs

Changed paths:
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index c73ba24..aa57811 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -35,7 +35,7 @@ namespace MADS {
 
 namespace Phantom {
 
-	Catacombs easy_catacombs[32] = {
+	Catacombs _easyCatacombs[32] = {
 		{ 401, { -1,  1,  2,  6 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
 		{ 404, { 10, 11,  3,  0 }, { 2, 3, 0, 1 }, MAZE_EVENT_PUDDLE },
 		{ 404, {  0,  3,  4, -2 }, { 2, 3, 0, 1 }, MAZE_EVENT_BLOCK },
@@ -70,7 +70,7 @@ namespace Phantom {
 		{ 408, { -5, -1, -4, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_BRICK }
 	};
 
-	Catacombs hard_catacombs[62] = {
+	Catacombs _hardCatacombs[62] = {
 		{ 401, { -1,  1,  2,  6 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK },
 		{ 404, { 10, 11,  3,  0 }, { 2, 3, 0, 1 }, MAZE_EVENT_PUDDLE },
 		{ 404, {  0,  3,  4, -2 }, { 2, 3, 0, 1 }, MAZE_EVENT_BLOCK },
@@ -303,7 +303,8 @@ void GamePhantom::initCatacombs() {
 void GamePhantom::setupCatacombs() {
 	switch (_difficulty) {
 	case DIFFICULTY_EASY:
-		catacombs = easy_catacombs;
+		_catacombs = _easyCatacombs;
+		_catacombSize = 32;
 
 		_globals[kCatacombs309]      = 2;
 		_globals[kCatacombs309From]  = 3;
@@ -316,7 +317,8 @@ void GamePhantom::setupCatacombs() {
 		break;
 
 	case DIFFICULTY_HARD:
-		catacombs = hard_catacombs;
+		_catacombs = _hardCatacombs;
+		_catacombSize = 62;
 
 		_globals[kCatacombs309]      = 2;
 		_globals[kCatacombs309From]  = 3;
@@ -330,6 +332,12 @@ void GamePhantom::setupCatacombs() {
 	}
 }
 
+int GamePhantom::exitCatacombs(int dir) {
+	int scene = _globals[kCatacombsRoom];
+	assert ((scene < _catacombSize) && (dir < 4));
+	return (_catacombs[scene]._exit[dir]);
+};
+
 } // End of namespace Phantom
 
 } // End of namespace MADS
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 1ba8ade..921d7a2 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -95,7 +95,8 @@ class GamePhantom : public Game {
 	friend class Game;
 
 private:
-	Catacombs *catacombs;
+	Catacombs *_catacombs;
+	int _catacombSize;
 
 protected:
 	GamePhantom(MADSEngine *vm);
@@ -127,7 +128,7 @@ public:
 	void enterCatacombs(int val);
 	void initCatacombs();
 	void moveCatacombs(int dir) { warning("TODO: moveCataCombs"); };
-	int exitCatacombs(int dir) { warning("TODO: exitCatacombs"); return -1; };
+	int exitCatacombs(int dir);
 };
 
 


Commit: cdc564b06049d064aeb15ad632fc4822a5d814d8
    https://github.com/scummvm/scummvm/commit/cdc564b06049d064aeb15ad632fc4822a5d814d8
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-03T23:12:44+01:00

Commit Message:
MADS: Phantom: Phantom isn't naughty!

Changed paths:
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index aa57811..ca2d687 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -137,7 +137,6 @@ namespace Phantom {
 
 GamePhantom::GamePhantom(MADSEngine *vm) : Game(vm) {
 	_surface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
-	_storyMode = STORYMODE_NAUGHTY;
 	_difficulty = DIFFICULTY_HARD;
 }
 
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 921d7a2..a7a91b3 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -32,9 +32,6 @@ namespace MADS {
 
 namespace Phantom {
 
-// TODO: Adapt for Phantom's difficulty setting
-enum StoryMode { STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2 };
-
 enum Difficulty {
 	DIFFICULTY_HARD = 1, DIFFICULTY_MEDIUM = 2, DIFFICULTY_EASY = 3
 };
@@ -110,7 +107,6 @@ protected:
 	virtual void checkShowDialog();
 public:
 	PhantomGlobals _globals;
-	StoryMode _storyMode;
 	Difficulty _difficulty;
 
 


Commit: d073f5767c0ab05afd072a7dd6c49cfa9c0363e6
    https://github.com/scummvm/scummvm/commit/d073f5767c0ab05afd072a7dd6c49cfa9c0363e6
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-04T14:45:22+01:00

Commit Message:
MADS: Phantom: Add more Catacombs functions

Changed paths:
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h
    engines/mads/phantom/phantom_scenes3.cpp



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index ca2d687..0512714 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -291,12 +291,33 @@ void GamePhantom::synchronize(Common::Serializer &s, bool phase1) {
 	}
 }
 
-void GamePhantom::enterCatacombs(int val) {
+void GamePhantom::enterCatacombs(bool val) {
 	warning("TODO: enterCatacombs");
+
+	setupCatacombs();
+
+	int var4, var2;
+	if (_scene._currentSceneId == 409) {
+		if (val) {
+			var4 = _globals[kCatacombs409b];
+			var2 = _globals[kCatacombs409bFrom];
+		} else {
+			var4 = _globals[kCatacombs409a];
+			var2 = _globals[kCatacombs409aFrom];
+		}
+	} else if (_scene._currentSceneId == 501) {
+		var4 = _globals[kCatacombs501];
+		var2 = _globals[kCatacombs501From];
+	} else {
+		var4 = _globals[kCatacombs309];
+		var2 = _globals[kCatacombs309From];
+	}
+
+	newCatacombRoom(var4, var2);
 }
 
 void GamePhantom::initCatacombs() {
-	warning("TODO: initCatacombs");
+	_globals[kCatacombsRoom] = _globals[kCatacombsNextRoom];
 }
 
 void GamePhantom::setupCatacombs() {
@@ -337,6 +358,51 @@ int GamePhantom::exitCatacombs(int dir) {
 	return (_catacombs[scene]._exit[dir]);
 };
 
+void GamePhantom::moveCatacombs(int dir) {
+	assert(_globals[kCatacombsRoom] = CLIP(_globals[kCatacombsRoom], 0, _catacombSize));
+	assert(dir = CLIP(dir, 0, 3));
+
+	newCatacombRoom(_catacombs[_globals[kCatacombsRoom]]._fromDirection[dir], _catacombs[_globals[kCatacombsRoom]]._exit[dir]);
+};
+
+void GamePhantom::newCatacombRoom(int toRoom, int fromExit) {
+	_globals[kCatacombsNextRoom] = toRoom;
+	_globals[kCatacombsFrom] = fromExit & 0x03;
+	_globals[kCatacombsFlag] = fromExit & 0xFC;
+
+	int newSceneNum = -1;
+
+	if (toRoom < 0) {
+		switch (toRoom) {
+		case -5:
+			newSceneNum = 501;
+			break;
+
+		case -4:
+		case -3:
+			newSceneNum = 409;
+			break;
+
+		case -2:
+			newSceneNum = 309;
+			break;
+
+		default:
+			error("Unexpected room in newCatacombRoom");
+		} 
+	} else {
+		newSceneNum = _catacombs[toRoom]._sceneNum;
+		_globals[81] = _catacombs[toRoom]._flags;
+	}
+
+	if (_triggerSetupMode == SEQUENCE_TRIGGER_PREPARE) {
+		_player._walkOffScreenSceneId = newSceneNum;
+	} else {
+		_scene._reloadSceneFlag = -1;
+		_scene._nextSceneId = newSceneNum;
+	}
+}
+
 } // End of namespace Phantom
 
 } // End of namespace MADS
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index a7a91b3..6c3f2fc 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -121,10 +121,11 @@ public:
 	virtual void synchronize(Common::Serializer &s, bool phase1);
 
 	void setupCatacombs();
-	void enterCatacombs(int val);
+	void enterCatacombs(bool val);
 	void initCatacombs();
-	void moveCatacombs(int dir) { warning("TODO: moveCataCombs"); };
+	void moveCatacombs(int dir);
 	int exitCatacombs(int dir);
+	void newCatacombRoom(int fromRoom, int fromExit);
 };
 
 
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 434dc57..f2b709c 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -2351,7 +2351,7 @@ void Scene309::actions() {
 			_boatStatus = 0;
 			_talkCount = 0;
 		} else if (_globals[kLanternStatus] == 1)
-			_game.enterCatacombs(0);
+			_game.enterCatacombs(false);
 
 		_action._inProgress = false;
 		return;


Commit: 9ef395524eb839eff70cb85c22c7bf8fc3567127
    https://github.com/scummvm/scummvm/commit/9ef395524eb839eff70cb85c22c7bf8fc3567127
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-04T18:22:23+01:00

Commit Message:
MADS: Phantom: Remove obsolete comment, fix the use of a boolean

Changed paths:
    engines/mads/phantom/game_phantom.cpp



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 0512714..a995cd0 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -292,8 +292,6 @@ void GamePhantom::synchronize(Common::Serializer &s, bool phase1) {
 }
 
 void GamePhantom::enterCatacombs(bool val) {
-	warning("TODO: enterCatacombs");
-
 	setupCatacombs();
 
 	int var4, var2;
@@ -398,7 +396,7 @@ void GamePhantom::newCatacombRoom(int toRoom, int fromExit) {
 	if (_triggerSetupMode == SEQUENCE_TRIGGER_PREPARE) {
 		_player._walkOffScreenSceneId = newSceneNum;
 	} else {
-		_scene._reloadSceneFlag = -1;
+		_scene._reloadSceneFlag = true;
 		_scene._nextSceneId = newSceneNum;
 	}
 }


Commit: 75ee599cbbd3d2a0e7dc017e11571f0767324b2a
    https://github.com/scummvm/scummvm/commit/75ee599cbbd3d2a0e7dc017e11571f0767324b2a
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-04T18:53:42+01:00

Commit Message:
MADS: Phantom: Implement generic scene 5xx

Changed paths:
  A engines/mads/phantom/phantom_scenes5.cpp
  A engines/mads/phantom/phantom_scenes5.h
    engines/mads/module.mk
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/module.mk b/engines/mads/module.mk
index ca277ea..c79a0ed 100644
--- a/engines/mads/module.mk
+++ b/engines/mads/module.mk
@@ -12,6 +12,7 @@ MODULE_OBJS := \
 	phantom/phantom_scenes2.o \
 	phantom/phantom_scenes3.o \
 	phantom/phantom_scenes4.o \
+	phantom/phantom_scenes5.o \
 	nebular/dialogs_nebular.o \
 	nebular/game_nebular.o \
 	nebular/globals_nebular.o \
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index b4d4f46..e9a60f0 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -32,6 +32,7 @@
 #include "mads/phantom/phantom_scenes2.h"
 #include "mads/phantom/phantom_scenes3.h"
 #include "mads/phantom/phantom_scenes4.h"
+#include "mads/phantom/phantom_scenes5.h"
 
 namespace MADS {
 
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
new file mode 100644
index 0000000..f40c6ee
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -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.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "mads/mads.h"
+#include "mads/conversations.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+#include "mads/phantom/phantom_scenes5.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+void Scene5xx::setAAName() {
+	_game._aaName = Resources::formatAAName(1);
+	_vm->_palette->setEntry(254, 43, 47, 51);
+}
+
+void Scene5xx::sceneEntrySound() {
+	if (!_vm->_musicFlag)
+		return;
+
+	if ((_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506) && (_globals[kFightStatus] == 0) && (_scene->_currentSceneId == 504))
+		_vm->_sound->command(33);
+	else if (_scene->_currentSceneId == 505)
+		_vm->_sound->command((_vm->_gameConv->_restoreRunning == 20) ? 39 : 16);
+	else
+		_vm->_sound->command(16);
+}
+
+void Scene5xx::setPlayerSpritesPrefix() {
+	_vm->_sound->command(5);
+
+	Common::String oldName = _game._player._spritesPrefix;
+	if (!_game._player._forcePrefix)
+		_game._player._spritesPrefix = "RAL";
+	if (oldName != _game._player._spritesPrefix)
+		_game._player._spritesChanged = true;
+
+	_game._player._scalingVelocity = true;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Phantom
+} // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h
new file mode 100644
index 0000000..9ce5bba
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes5.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 MADS_PHANTOM_SCENES5_H
+#define MADS_PHANTOM_SCENES5_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+class Scene5xx : public PhantomScene {
+protected:
+	/**
+	 * Plays an appropriate sound when entering a scene
+	 */
+	void sceneEntrySound();
+
+	/**
+	 *Sets the AA file to use for the scene
+	 */
+	void setAAName();
+
+	/**
+	 * Updates the prefix used for getting player sprites for the scene
+	 */
+	void setPlayerSpritesPrefix();
+public:
+	Scene5xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
+};
+
+} // End of namespace Phantom
+} // End of namespace MADS
+
+#endif /* MADS_PHANTOM_SCENES5_H */


Commit: 4682aec14711202d95ae570fb97856f846cf7539
    https://github.com/scummvm/scummvm/commit/4682aec14711202d95ae570fb97856f846cf7539
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-04T22:34:26+01:00

Commit Message:
MADS: Phantom: Implement scene 501

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/phantom/phantom_scenes5.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index e9a60f0..e4a54cc 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -143,7 +143,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 
 	// Scene group #5 (Phantom's hideout)
 	case 501:	// catacombs, outside phantom's hideout, lake and boat
-		return new DummyScene(vm);	// TODO
+		return new Scene501(vm);
 	case 502:	// push panel trap
 		return new DummyScene(vm);	// TODO
 	case 504:	// Phantom's hideout, church organ
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index f40c6ee..6fcdcb0 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -62,5 +62,584 @@ void Scene5xx::setPlayerSpritesPrefix() {
 
 /*------------------------------------------------------------------------*/
 
+Scene501::Scene501(MADSEngine *vm) : Scene5xx(vm) {
+	_anim_0_running = false;
+	_prevent_2 = false;
+}
+
+void Scene501::synchronize(Common::Serializer &s) {
+	Scene5xx::synchronize(s);
+
+	s.syncAsByte(_anim_0_running);
+	s.syncAsByte(_prevent_2);
+}
+
+void Scene501::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_CHRISTINE);
+	_scene->addActiveVocab(VERB_LOOK_AT);
+	_scene->addActiveVocab(VERB_WALK_TO);
+}
+
+void Scene501::enter() {
+	_scene->_hotspots.activate(NOUN_CHRISTINE, false);
+	_scene->_hotspots.activate(NOUN_BOAT, false);
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim_0_running = false;
+		_prevent_2 = false;
+	}
+
+	_vm->_gameConv->get(26);
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_9", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_8", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDRR_6", false);
+
+	_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		if (_globals[kChristineIsInBoat]) {
+			_anim_0_running = true;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100);
+			_scene->setAnimFrame(_globals._animationIndexes[0], 124);
+			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(113, 93));
+			_scene->_hotspots.activate(NOUN_BOAT, true);
+		}
+
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+	}
+
+	if (_scene->_priorSceneId == 506) {
+		_game._player._playerPos = Common::Point(305, 112);
+		_game._player._facing = FACING_WEST;
+		_game._player._stepEnabled = false;
+
+		if (_globals[kChristineIsInBoat]) {
+			_anim_0_running = true;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100);
+			_scene->setAnimFrame(_globals._animationIndexes[0], 124);
+			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(113, 93));
+			_scene->_hotspots.activate(NOUN_BOAT, true);
+			_game._player.walk(Common::Point(260, 112), FACING_SOUTHWEST);
+			_game._player.setWalkTrigger(80);
+			_game._player.setWalkTrigger(55);
+		} else {
+			_anim_0_running = true;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100);
+			_globals[kChristineIsInBoat] = true;
+			_scene->_hotspots.activate(NOUN_BOAT, true);
+			_game._player.walk(Common::Point(260, 112), FACING_SOUTHWEST);
+			_game._player.setWalkTrigger(80);
+		}
+
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
+
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+	} else if ((_scene->_priorSceneId == 401) || (_scene->_priorSceneId == 408) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player.firstWalk(Common::Point(-20, 109), FACING_EAST, Common::Point(24, 109), FACING_EAST, true);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
+
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene501::step() {
+	switch (_game._trigger) {
+	case 55:
+		_scene->deleteSequence(_globals._sequenceIndexes[2]);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 56);
+		break;
+
+	case 56:
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+		if (!_globals[kChrisWillTakeSeat])
+			_game._player._stepEnabled = true;
+
+		_globals[kChrisWillTakeSeat] = false;
+		break;
+
+	default:
+		break;
+	}
+
+
+	switch (_game._trigger) {
+	case 60:
+		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 61);
+		break;
+
+	case 61:
+		_vm->_sound->command(25);
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
+		_game._player._stepEnabled = true;
+		break;
+
+	case 80: {
+		_game._player.walk(Common::Point(255, 118), FACING_NORTHWEST);
+		_scene->setAnimFrame(_globals._animationIndexes[0], 2);
+		int idx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+		_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0);
+		_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 1);
+		_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 2);
+		_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 3);
+		}
+		break;
+
+	case 90:
+		_globals[kPlayerScore] += 5;
+		_scene->_nextSceneId = 310;
+		break;
+
+	case 100:
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 9, 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 90);
+		break;
+
+	default:
+		break;
+	}
+
+	if (_anim_0_running) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 103)
+			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(125, 94));
+
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 28) && !_prevent_2) {
+			_prevent_2 = true;
+			_scene->_sequences.setTimingTrigger(1, 55);
+		}
+
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 124) {
+			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(125, 94));
+			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true , Common::Point(113, 93));
+		}
+
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 125)
+			_scene->setAnimFrame(_globals._animationIndexes[0], 124);
+
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 1)
+			_scene->setAnimFrame(_globals._animationIndexes[0], 0);
+
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 84)
+			_game._player._stepEnabled = true;
+	}
+}
+
+void Scene501::actions() {
+	if (_vm->_gameConv->_running == 26) {
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST) && (_globals[kChristineIsInBoat])) {
+		_vm->_gameConv->run(26);
+		_vm->_gameConv->exportValue(3);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) {
+		_vm->_gameConv->run(26);
+		_vm->_gameConv->exportValue(1);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT)) {
+		if (_game._objects.isInInventory(OBJ_OAR))
+			_anim_0_running = false;
+		else
+			_vm->_dialogs->show(50123);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 1);
+			break;
+
+		case 1: {
+			int idx = _globals._sequenceIndexes[3];
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
+			_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
+			_scene->_sequences.setTimingTrigger(15, 2);
+			_vm->_sound->command(74);
+			}
+			break;
+
+		case 2:
+			_scene->deleteSequence(_globals._sequenceIndexes[3]);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 3);
+			break;
+
+		case 3:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[3]);
+			_game._player._visible = true;
+			_vm->_dialogs->show(50122);
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		if (_scene->_customDest.x < 287) {
+			if (!_globals[kChristineIsInBoat]) {
+				switch (_game._trigger) {
+				case 0:
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 1);
+					break;
+
+				case 1: {
+					int idx = _globals._sequenceIndexes[3];
+					_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
+					_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
+					_scene->_sequences.setTimingTrigger(15, 2);
+					_vm->_sound->command(74);
+					}
+					break;
+
+				case 2:
+					_scene->deleteSequence(_globals._sequenceIndexes[3]);
+					_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 3);
+					break;
+
+				case 3:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[3]);
+					_game._player._visible = true;
+					_vm->_dialogs->show(50120);
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+			} else {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 4, 65);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 67);
+					break;
+
+				case 65:
+					_scene->deleteSequence(_globals._sequenceIndexes[2]);
+					_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
+					_vm->_sound->command(24);
+					break;
+
+				case 66:
+					_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+					_game._player.walk(Common::Point(305, 112), FACING_EAST);
+					_game._player.setWalkTrigger(68);
+					break;
+
+				case 67:
+					_game._player._visible = true;
+					break;
+
+				case 68:
+					_vm->_gameConv->abortConv();
+					_scene->_nextSceneId = 506;
+					break;
+				}
+			}
+		} else {
+			if (!_globals[kChristineIsInBoat]) {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 4, 65);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 67);
+					break;
+
+				case 65: {
+					int idx = _globals._sequenceIndexes[1];
+					_scene->deleteSequence(_globals._sequenceIndexes[1]);
+					_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
+					_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
+					_vm->_sound->command(24);
+						 }
+						 break;
+
+				case 66:
+					_game._player.walk(Common::Point(319, 116), FACING_NORTHWEST);
+					_game._player.setWalkTrigger(68);
+					break;
+
+				case 67:
+					_game._player._visible = true;
+					break;
+
+				case 68:
+					_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 69);
+					_vm->_sound->command(25);
+					break;
+
+				case 69:
+					_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 5);
+					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+					_scene->_nextSceneId = 502;
+					break;
+				}
+			} else {
+				switch (_game._trigger) {
+				case (0):
+					_game._player._stepEnabled = false;
+					_game._player._visible = false;
+					_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 1);
+					break;
+
+				case 1: {
+					int idx = _globals._sequenceIndexes[3];
+					_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
+					_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
+					_scene->_sequences.setTimingTrigger(15, 2);
+					_vm->_sound->command(73);
+						}
+						break;
+
+				case 2:
+					_scene->deleteSequence(_globals._sequenceIndexes[3]);
+					_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
+					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
+					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 3);
+					break;
+
+				case 3:
+					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[3]);
+					_game._player._visible = true;
+					_vm->_dialogs->show(50120);
+					_game._player._stepEnabled = true;
+					break;
+
+				default:
+					break;
+				}
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(50110);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(50111);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(50112);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(50113);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LAKE)) {
+			_vm->_dialogs->show(50114);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BOAT)) {
+			_vm->_dialogs->show(50126);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TORCH)) {
+			_vm->_dialogs->show(50117);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ARCHWAY_TO_WEST)) {
+			_vm->_dialogs->show(50118);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR)) {
+			if (_scene->_customDest.x < 287) {
+				if (_game._visitedScenes.exists(506))
+					_vm->_dialogs->show(50127);
+				else
+					_vm->_dialogs->show(50119);
+			} else {
+				if (_game._visitedScenes.exists(506))
+					_vm->_dialogs->show(50128);
+				else
+					_vm->_dialogs->show(50119);
+			}
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_COLUMN)) {
+			_vm->_dialogs->show(50121);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHRISTINE)) {
+			_vm->_dialogs->show(50124);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_TORCH)) {
+		_vm->_dialogs->show(50125);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) {
+		_vm->_dialogs->show(50129);
+		_action._inProgress = false;
+	}
+}
+
+void Scene501::preActions() {
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) {
+		if (_globals[kLanternStatus] == 0) {
+			_game._player._needToWalk = false;
+			_vm->_dialogs->show(30918);
+			_game._player.cancelCommand();
+		} else if (!_globals[kChristineIsInBoat])
+			_game.enterCatacombs(0);
+	}
+
+	if ((_action.isObject(NOUN_DOOR)) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN))) {
+		if (_scene->_customDest.x < 287)
+			_game._player.walk(Common::Point(266, 112), FACING_EAST);
+		else
+			_game._player.walk(Common::Point(287, 118), FACING_EAST);
+	}
+
+	if ((_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) && _game._visitedScenes.exists(506) && _scene->_customDest.x < 287) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._readyToWalk = false;
+			_game._player._needToWalk = false;
+			_game._player._stepEnabled = false;
+			_vm->_gameConv->run(26);
+			_vm->_gameConv->exportValue(2);
+			_scene->_sequences.setTimingTrigger(6, 1);
+			break;
+
+		case 1:
+			if (_vm->_gameConv->_running >= 0)
+				_scene->_sequences.setTimingTrigger(6, 1);
+			else {
+				_game._player._stepEnabled = true;
+				_action._inProgress = true;
+				_game._player._needToWalk = true;
+				_game._player._readyToWalk = true;
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST) && _globals[kLanternStatus] && _globals[kRightDoorIsOpen504])
+		_game._player.walk(Common::Point(24, 110), FACING_WEST);
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h
index 9ce5bba..9b07e92 100644
--- a/engines/mads/phantom/phantom_scenes5.h
+++ b/engines/mads/phantom/phantom_scenes5.h
@@ -53,6 +53,22 @@ public:
 	Scene5xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
 };
 
+class Scene501 : public Scene5xx {
+private:
+	bool _anim_0_running;
+	bool _prevent_2;
+
+public:
+	Scene501(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 89206327987c011292cdcb976d9950d364873584
    https://github.com/scummvm/scummvm/commit/89206327987c011292cdcb976d9950d364873584
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-05T19:05:18+01:00

Commit Message:
MADS: Phantom: Implement scene 502 (except palette cycling)

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/phantom/phantom_scenes5.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index e4a54cc..8a97587 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -145,7 +145,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 501:	// catacombs, outside phantom's hideout, lake and boat
 		return new Scene501(vm);
 	case 502:	// push panel trap
-		return new DummyScene(vm);	// TODO
+		return new Scene502(vm);
 	case 504:	// Phantom's hideout, church organ
 		return new DummyScene(vm);	// TODO
 	case 505:	// Phantom's hideout, sarcophagus
diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index 0987d6f..caf3906 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -53,6 +53,7 @@ enum Verb {
 	VERB_EXIT = 0x34,
 	VERB_EXIT_TO = 0x37,
 	VERB_JUMP_INTO = 0x53,
+	VERB_LASSO = 0x59,
 	VERB_LOCK = 0x5D,
 	VERB_LOOK_AT = 0x60,
 	VERB_LOOK_THROUGH = 0x61,
@@ -69,6 +70,7 @@ enum Verb {
 	VERB_ENTER = 0xEC,
 	VERB_WALK_BEHIND = 0xF3,
 	VERB_CLIMB = 0x120,
+	VERB_GRAPPLE = 0x133,
 	VERB_WALK_DOWN_STAIRS_TO = 0x153
 };
 
@@ -143,7 +145,6 @@ enum Noun {
 	NOUN_LAMP = 0x56,
 	NOUN_LANTERN = 0x57,
 	NOUN_LARGE_NOTE = 0x58,
-	NOUN_LASSO = 0x59,
 	NOUN_LEG = 0x5A,
 	NOUN_LETTER = 0x5B,
 	NOUN_LIGHT_FIXTURE = 0x5C,
@@ -345,7 +346,6 @@ enum Noun {
 	NOUN_CABLE_HOOK = 0x130,
 	NOUN_ATTACH = 0x131,
 	NOUN_ROPE_WITH_HOOK = 0x132,
-	NOUN_GRAPPLE = 0x133,
 	NOUN_OAR = 0x134,
 	NOUN_ORGAN = 0x135,
 	NOUN_SIT_AT = 0x136,
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 6fcdcb0..43eafa8 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -63,15 +63,15 @@ void Scene5xx::setPlayerSpritesPrefix() {
 /*------------------------------------------------------------------------*/
 
 Scene501::Scene501(MADSEngine *vm) : Scene5xx(vm) {
-	_anim_0_running = false;
-	_prevent_2 = false;
+	_anim0ActvFl = false;
+	_skipFl = false;
 }
 
 void Scene501::synchronize(Common::Serializer &s) {
 	Scene5xx::synchronize(s);
 
-	s.syncAsByte(_anim_0_running);
-	s.syncAsByte(_prevent_2);
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_skipFl);
 }
 
 void Scene501::setup() {
@@ -88,8 +88,8 @@ void Scene501::enter() {
 	_scene->_hotspots.activate(NOUN_BOAT, false);
 
 	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
-		_anim_0_running = false;
-		_prevent_2 = false;
+		_anim0ActvFl = false;
+		_skipFl = false;
 	}
 
 	_vm->_gameConv->get(26);
@@ -110,7 +110,7 @@ void Scene501::enter() {
 
 	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
 		if (_globals[kChristineIsInBoat]) {
-			_anim_0_running = true;
+			_anim0ActvFl = true;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100);
 			_scene->setAnimFrame(_globals._animationIndexes[0], 124);
 			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(113, 93));
@@ -129,7 +129,7 @@ void Scene501::enter() {
 		_game._player._stepEnabled = false;
 
 		if (_globals[kChristineIsInBoat]) {
-			_anim_0_running = true;
+			_anim0ActvFl = true;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100);
 			_scene->setAnimFrame(_globals._animationIndexes[0], 124);
 			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(113, 93));
@@ -138,7 +138,7 @@ void Scene501::enter() {
 			_game._player.setWalkTrigger(80);
 			_game._player.setWalkTrigger(55);
 		} else {
-			_anim_0_running = true;
+			_anim0ActvFl = true;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100);
 			_globals[kChristineIsInBoat] = true;
 			_scene->_hotspots.activate(NOUN_BOAT, true);
@@ -231,12 +231,12 @@ void Scene501::step() {
 		break;
 	}
 
-	if (_anim_0_running) {
+	if (_anim0ActvFl) {
 		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 103)
 			_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(125, 94));
 
-		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 28) && !_prevent_2) {
-			_prevent_2 = true;
+		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 28) && !_skipFl) {
+			_skipFl = true;
 			_scene->_sequences.setTimingTrigger(1, 55);
 		}
 
@@ -278,7 +278,7 @@ void Scene501::actions() {
 
 	if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT)) {
 		if (_game._objects.isInInventory(OBJ_OAR))
-			_anim_0_running = false;
+			_anim0ActvFl = false;
 		else
 			_vm->_dialogs->show(50123);
 
@@ -641,5 +641,1157 @@ void Scene501::preActions() {
 
 /*------------------------------------------------------------------------*/
 
+Scene502::Scene502(MADSEngine *vm) : Scene5xx(vm) {
+	_fire1ActiveFl = false;
+	_fire2ActiveFl = false;
+	_fire3ActiveFl = false;
+	_fire4ActiveFl = false;
+	_panelTurningFl = false;
+	_trapDoorHotspotEnabled = false;
+	_acceleratedFireActivationFl = false;
+
+	for (int i = 0; i < 16; i++) {
+		_puzzlePictures[i] = -1;
+		_puzzleSprites[i] = -1;
+		_puzzleSequences[i] = -1;
+	}
+
+	_panelPushedNum = -1;
+	_messageLevel = -1;
+	_cycleStage = -1;
+
+	_nextPos = Common::Point(-1, -1);
+
+	_lastFrameTime = 0;
+	_timer = 0;
+	_deathTimer = 0;
+
+	_cyclePointer = nullptr;
+}
+
+Scene502::~Scene502() {
+	if (_cyclePointer)
+		delete(_cyclePointer);
+}
+
+void Scene502::synchronize(Common::Serializer &s) {
+	Scene5xx::synchronize(s);
+
+	s.syncAsByte(_fire1ActiveFl);
+	s.syncAsByte(_fire2ActiveFl);
+	s.syncAsByte(_fire3ActiveFl);
+	s.syncAsByte(_fire4ActiveFl);
+	s.syncAsByte(_panelTurningFl);
+	s.syncAsByte(_trapDoorHotspotEnabled);
+	s.syncAsByte(_acceleratedFireActivationFl);
+
+	for (int i = 0; i < 16; i++) {
+		s.syncAsSint16LE(_puzzlePictures[i]);
+		s.syncAsSint16LE(_puzzleSprites[i]);
+		s.syncAsSint16LE(_puzzleSequences[i]);
+	}
+
+	s.syncAsSint16LE(_panelPushedNum);
+	s.syncAsSint16LE(_messageLevel);
+	s.syncAsSint16LE(_cycleStage);
+
+	s.syncAsSint16LE(_nextPos.x);
+	s.syncAsSint16LE(_nextPos.y);
+
+	s.syncAsUint32LE(_lastFrameTime);
+	s.syncAsUint32LE(_timer);
+	s.syncAsUint32LE(_deathTimer);
+
+	warning("more syncing required");
+}
+
+void Scene502::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+}
+
+void Scene502::enter() {
+	loadCyclingInfo();
+	_scene->loadSpeech(7);
+
+	_panelPushedNum = -1;
+	_panelTurningFl = false;
+	_fire1ActiveFl = false;
+	_fire2ActiveFl = false;
+	_fire3ActiveFl = false;
+	_fire4ActiveFl = false;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_lastFrameTime = _scene->_frameStartTime;
+		_cycleStage = 0;
+		_timer = 0;
+		_deathTimer = 0;
+		_messageLevel = 1;
+		_acceleratedFireActivationFl = true;
+		_trapDoorHotspotEnabled = false;
+	}
+
+	_scene->_hotspots.activate(NOUN_ROPE, false);
+	_scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, false, Common::Point(225, 28));
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 5), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 3), false);
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 6), false);
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('j', 0), false);
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('k', 0), false);
+	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('l', 0), false);
+	_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('m', 0), false);
+	_globals._spriteIndexes[16] = _scene->_sprites.addSprites(formAnimName('h', 0), false);
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+	} else
+		_scene->drawToBackground(_globals._spriteIndexes[5], -2, Common::Point(-32000, -32000), 0, 100);
+
+	if ((_scene->_priorSceneId == 501) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		if (!_game._visitedScenes._sceneRevisited) {
+			if (_game._objects.isInInventory(OBJ_ROPE))
+				_globals[kCableHookWasSeparate] = true;
+			else
+				_globals[kCableHookWasSeparate] = false;
+		} else if (_globals[kCableHookWasSeparate]) {
+			_game._objects.addToInventory(OBJ_ROPE);
+			_game._objects.addToInventory(OBJ_CABLE_HOOK);
+			_game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE);
+		} else {
+			_game._objects.setRoom(OBJ_ROPE, NOWHERE);
+			_game._objects.setRoom(OBJ_CABLE_HOOK, NOWHERE);
+			_game._objects.addToInventory(OBJ_ROPE_WITH_HOOK);
+		}
+
+		_game._player._playerPos = Common::Point(43, 154);
+		_game._player._facing = FACING_EAST;
+		_game._player._stepEnabled = false;
+		_game._player.walk(Common::Point(87, 153), FACING_EAST);
+		_game._player.setWalkTrigger(77);
+	}
+
+	room_502_initialize_panels();
+
+	if (_trapDoorHotspotEnabled) {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 6);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+		_scene->_hotspots.activate(NOUN_TRAP_DOOR, false);
+		_scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, true, Common::Point(225, 28));
+		if (!_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK) && !_game._objects.isInInventory(OBJ_CABLE_HOOK)) {
+			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 12);
+			_scene->_hotspots.activate(NOUN_ROPE, true);
+		}
+	} else {
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene502::step() {
+	if (_acceleratedFireActivationFl) {
+		int32 diff = _scene->_frameStartTime - _lastFrameTime;
+		if ((diff >= 0) && (diff <= 4)) {
+			_timer += diff;
+			_deathTimer += diff;
+		} else {
+			_timer += 1;
+			_deathTimer += 1;
+		}
+		_lastFrameTime = _scene->_frameStartTime;
+
+		if (_timer >= 300) {
+			_timer = 0;
+			if (_cycleStage < 8)
+				++_cycleStage;
+		}
+	}
+
+	if ((_deathTimer >= 7200)  && !_panelTurningFl) {
+		_vm->_dialogs->show(50215);
+		_game._player.walk(Common::Point(160, 148), FACING_NORTH);
+		_game._player.setWalkTrigger(71);
+		_game._player._stepEnabled = false;
+		_panelTurningFl = true;
+		_deathTimer = 0;
+	}
+
+	if ((_deathTimer > 900) && (_messageLevel == 1) && !_panelTurningFl) {
+		_messageLevel = 2;
+		_vm->_dialogs->show(50212);
+	}
+
+	if ((_deathTimer > 3600) && (_messageLevel == 2) && !_panelTurningFl) {
+		_messageLevel = 3;
+		_vm->_dialogs->show(50213);
+	}
+
+	if ((_deathTimer > 5400) && (_messageLevel == 3) && !_panelTurningFl) {
+		_messageLevel = 4;
+		_vm->_dialogs->show(50214);
+	}
+
+	switch (_game._trigger) {
+	case 71:
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 72);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 44, 73);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 51, 74);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 32, 75);
+		break;
+
+	case 72:
+		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, -2);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+		_scene->_userInterface.noInventoryAnim();
+		// CHECKME: Not sure about the next function call
+		_scene->_userInterface.refresh();
+		_scene->_sequences.setTimingTrigger(120, 76);
+		break;
+
+	case 73:
+		_vm->_sound->command(1);
+		_vm->_sound->command(67);
+		break;
+
+	case 74:
+		_vm->_sound->command(27);
+		break;
+
+	case 75:
+		_scene->playSpeech(7);
+		break;
+
+	case 76:
+		_scene->_reloadSceneFlag = true;
+		break;
+
+	case 77:
+		_scene->deleteSequence(_globals._sequenceIndexes[5]);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 78);
+		break;
+
+	case 78:
+		_vm->_dialogs->show(50211);
+		_scene->drawToBackground(_globals._spriteIndexes[5], -2, Common::Point(-32000, -32000), 0, 100);
+		_game._player._stepEnabled = true;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!_trapDoorHotspotEnabled)
+		animateFireBursts();
+
+	setPaletteCycle();
+}
+
+void Scene502::actions() {
+	if (_game._trigger >= 110) {
+		handlePanelAnimation();
+		_action._inProgress = false;
+		return;
+	}
+
+	switch (_game._trigger) {
+	case 80:
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 6);
+		_scene->_hotspots.activateAtPos(NOUN_ROPE, true, Common::Point(225, 28));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+		_scene->_hotspots.activate(NOUN_TRAP_DOOR, false);
+		_scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, true, Common::Point(225, 28));
+		if (!_panelTurningFl)
+			_vm->_dialogs->show(50216);
+
+		_action._inProgress = false;
+		return;
+
+	case 90:
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 7, 2);
+		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 14, 18);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 91);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 2, 18, 110);
+		_action._inProgress = false;
+		return;
+
+	case 91:
+		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		_scene->_sequences.setTimingTrigger(5, 102);
+		_action._inProgress = false;
+		return;
+
+	case 95:
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 7, 2);
+		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 8, 13);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 96);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 2, 13, 110);
+		_action._inProgress = false;
+		return;
+
+	case 96:
+		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		_scene->_sequences.setTimingTrigger(5, 102);
+		_action._inProgress = false;
+		return;
+
+	case 100:
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 2);
+		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 5, 7);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 101);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 2, 7, 110);
+		_action._inProgress = false;
+		return;
+
+	case 101:
+		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
+		_game._player._visible = true;
+		_scene->_sequences.setTimingTrigger(5, 102);
+		_action._inProgress = false;
+		return;
+
+	case 102:
+		_panelTurningFl = false;
+		_game._player._stepEnabled = true;
+		_action._inProgress = false;
+		return;
+
+	case 105:
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 8, 2);
+		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 4);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 106);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 2, 4, 110);
+		_action._inProgress = false;
+		return;
+
+	case 106:
+		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
+		_game._player._visible = true;
+		_scene->_sequences.setTimingTrigger(5, 102);
+		_action._inProgress = false;
+		return;
+
+	default:
+		break;
+	}
+
+	if (_action.isAction(VERB_PUSH, NOUN_PANEL)) {
+		if (_panelTurningFl) {
+			_action._inProgress = false;
+			return;
+		}
+
+		Common::Point walkToPos;
+		getPanelInfo(&walkToPos, &_panelPushedNum, _scene->_customDest, &_nextPos);
+		_panelTurningFl = true;
+
+		switch (_panelPushedNum) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			_scene->_sequences.setTimingTrigger(1, 90);
+			break;
+
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+			_scene->_sequences.setTimingTrigger(1, 95);
+			break;
+
+		case 8:
+		case 9:
+		case 10:
+		case 11:
+			_scene->_sequences.setTimingTrigger(1, 100);
+			break;
+
+		default:
+			_scene->_sequences.setTimingTrigger(1, 105);
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_THROW, NOUN_ROPE_WITH_HOOK, NOUN_TRAP_DOOR) || _action.isAction(VERB_GRAPPLE, NOUN_TRAP_DOOR)) {
+		if (_trapDoorHotspotEnabled) {
+			switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_panelTurningFl = true;
+			_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 13);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 82);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 10, 83);
+			_game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE);
+			break;
+
+		case 82:
+			_game._player._stepEnabled = true;
+			_game._player._visible = true;
+			_panelTurningFl = false;
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 13);
+			_scene->_hotspots.activate(NOUN_ROPE, true);
+			break;
+
+		case 83:
+			_vm->_sound->command(69);
+			break;
+
+		default:
+			break;
+			}
+		} else
+			_vm->_dialogs->show(50229);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)
+	 && (_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK) || _game._objects.isInInventory(OBJ_CABLE_HOOK))) {
+		_vm->_dialogs->show(50228);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_THROW, NOUN_ROPE, NOUN_TRAP_DOOR)) {
+		_vm->_dialogs->show(50226);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_THROW, NOUN_CABLE_HOOK, NOUN_TRAP_DOOR)) {
+		_vm->_dialogs->show(50227);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLIMB, NOUN_ROPE) || _action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) {
+		switch (_game._trigger) {
+		case 0:
+			_globals[kPlayerScore] += 5;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_panelTurningFl = true;
+			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 10);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 82);
+			break;
+
+		case 82:
+			_scene->_nextSceneId = 504;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(50210);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(50217);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TRAP_DOOR)) {
+			_vm->_dialogs->show(_trapDoorHotspotEnabled ? 50220 : 50225);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(50219);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR)) {
+			_vm->_dialogs->show(50221);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PANELS)) {
+			_vm->_dialogs->show(50222);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PANEL)) {
+			_vm->_dialogs->show(50223);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(50224);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE) && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
+			_vm->_dialogs->show(50233);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) {
+		_vm->_dialogs->show(_trapDoorHotspotEnabled ? 50230 : 50228);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR)) {
+		_vm->_dialogs->show(_trapDoorHotspotEnabled ? 50228 : 50231);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE) && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
+		_vm->_dialogs->show(50234);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LASSO, NOUN_TRAP_DOOR)) {
+		_vm->_dialogs->show(50232);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene502::preActions() {
+	int panel;
+
+	if (_action.isAction(VERB_PUSH, NOUN_PANEL)) {
+		Common::Point walkToPos;
+		Common::Point tmpPos;
+		getPanelInfo(&walkToPos, &panel, _scene->_customDest, &tmpPos);
+		_game._player.walk(walkToPos, FACING_NORTH);
+	}
+
+	if (_trapDoorHotspotEnabled && (_action.isAction(VERB_CLIMB, NOUN_ROPE) || _action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)))
+		_game._player.walk(Common::Point(211, 149), FACING_NORTH);
+
+	if (_trapDoorHotspotEnabled && (_action.isAction(VERB_THROW, NOUN_ROPE_WITH_HOOK, NOUN_TRAP_DOOR) || _action.isAction(VERB_GRAPPLE, NOUN_TRAP_DOOR)))
+		_game._player.walk(Common::Point(200, 149), FACING_NORTH);
+}
+
+void Scene502::room_502_initialize_panels() {
+	for (int i = 0, curPuzzleSprite = 2, count = 1; i < 16; i++) {
+		if (_scene->_priorSceneId != RETURNING_FROM_LOADING)
+			_puzzlePictures[i] = _vm->getRandomNumber(1, 4);
+
+		curPuzzleSprite += (_puzzlePictures[i] * 3) - 3;
+		_puzzleSprites[i] = curPuzzleSprite;
+
+		int sprIdx;
+
+		switch (i) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			sprIdx = _globals._spriteIndexes[11];
+			break;
+
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+			sprIdx = _globals._spriteIndexes[12];
+			break;
+
+		case 8:
+		case 9:
+		case 10:
+		case 11:
+			sprIdx = _globals._spriteIndexes[13];
+			break;
+
+		default:
+			sprIdx = _globals._spriteIndexes[14];
+			break;
+		}
+
+		_globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(sprIdx, false, curPuzzleSprite);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14);
+		_puzzleSequences[i] = _globals._sequenceIndexes[15];
+
+		++count;
+		if (count >= 5)
+			count = 1;
+
+		switch (count) {
+		case 1:
+			curPuzzleSprite = 2;
+			break;
+
+		case 2:
+			curPuzzleSprite = 14;
+			break;
+
+		case 3:
+			curPuzzleSprite = 26;
+			break;
+
+		case 4:
+			curPuzzleSprite = 38;
+			break;
+		}
+	}
+}
+
+void Scene502::loadCyclingInfo() {
+	warning("TODO: loadCyclingInfo");
+}
+
+void Scene502::animateFireBursts() {
+	int rndTrigger;
+
+	if (_acceleratedFireActivationFl)
+		rndTrigger = _vm->getRandomNumber(1, 50);
+	else
+		rndTrigger = _vm->getRandomNumber(1, 400);
+
+	if (rndTrigger == 1) {
+		rndTrigger = _vm->getRandomNumber(1, 4);
+
+		switch (rndTrigger) {
+		case 1:
+			if (!_fire1ActiveFl) {
+				_scene->_sequences.setTimingTrigger(_vm->getRandomNumber(300, 600), 60);
+				_fire1ActiveFl = true;
+			}
+			break;
+
+		case 2:
+			if (!_fire2ActiveFl) {
+				_scene->_sequences.setTimingTrigger(_vm->getRandomNumber(300, 600), 63);
+				_fire2ActiveFl = true;
+			}
+			break;
+
+		case 3:
+			if (!_fire3ActiveFl) {
+				_scene->_sequences.setTimingTrigger(_vm->getRandomNumber(300, 600), 66);
+				_fire3ActiveFl = true;
+			}
+			break;
+
+		case 4:
+			if (!_fire4ActiveFl) {
+				_scene->_sequences.setTimingTrigger(_vm->getRandomNumber(300, 600), 69);
+				_fire4ActiveFl = true;
+			}
+			break;
+		}
+	}
+
+	switch (_game._trigger) {
+	case 60:
+		if ((_game._player._playerPos.x < 198) || (_game._player._playerPos.y > 150)) {
+			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 10);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
+		}
+		break;
+
+	case 61:
+		_fire1ActiveFl = false;
+		break;
+
+	case 63:
+		if ((_game._player._playerPos.x > 127) || (_game._player._playerPos.y < 150)) {
+			_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 10);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 64);
+		}
+		break;
+
+	case 64:
+		_fire2ActiveFl = false;
+		break;
+
+	case 66:
+		if (_game._player._playerPos.x < 198) {
+			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 10);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 67);
+		}
+		break;
+
+	case 67:
+		_fire3ActiveFl = false;
+		break;
+
+	case 69:
+		if ((_game._player._playerPos.x > 110) || (_game._player._playerPos.y > 150)) {
+			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 10);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 70);
+		}
+		break;
+
+	case 70:
+		_fire4ActiveFl = false;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene502::setPaletteCycle() {
+	warning("TODO: setPaletteCycle");
+}
+
+void Scene502::getPanelInfo(Common::Point *walkToPos, int *panel, Common::Point mousePos, Common::Point *interimPos) {
+	walkToPos->y = 148;
+
+	if ((mousePos.x >= 120) && (mousePos.x <= 139)) {
+		interimPos->x = 129;
+		if ((mousePos.y >=75) && (mousePos.y <=90)) {
+			*panel = 0;
+			interimPos->y = 90;
+			walkToPos->x = 107;
+		}
+
+		if ((mousePos.y >=91) && (mousePos.y <=106)) {
+			*panel = 4;
+			interimPos->y = 106;
+			walkToPos->x = 107;
+		}
+
+		if ((mousePos.y >=107) && (mousePos.y <=122)) {
+			*panel = 8;
+			interimPos->y = 122;
+			walkToPos->x = 107;
+		}
+
+		if ((mousePos.y >=123) && (mousePos.y <=137)) {
+			*panel = 12;
+			interimPos->y = 138;
+			walkToPos->x = 107;
+		}
+	}
+
+	if ((mousePos.x >= 140) && (mousePos.x <= 159)) {
+		interimPos->x = 149;
+		if ((mousePos.y >=75) && (mousePos.y <=90)) {
+			*panel = 1;
+			interimPos->y = 90;
+			walkToPos->x = 127;
+		}
+
+		if ((mousePos.y >=91) && (mousePos.y <=106)) {
+			*panel = 5;
+			interimPos->y = 106;
+			walkToPos->x = 127;
+		}
+
+		if ((mousePos.y >=107) && (mousePos.y <=122)) {
+			*panel = 9;
+			interimPos->y = 122;
+			walkToPos->x = 127;
+		}
+
+		if ((mousePos.y >=123) && (mousePos.y <=137)) {
+			*panel = 13;
+			interimPos->y = 138;
+			walkToPos->x = 127;
+		}
+	}
+
+	if ((mousePos.x >= 160) && (mousePos.x <= 179)) {
+		interimPos->x = 169;
+		if ((mousePos.y >=75) && (mousePos.y <=90)) {
+			*panel = 2;
+			interimPos->y = 90;
+			walkToPos->x = 147;
+		}
+
+		if ((mousePos.y >=91) && (mousePos.y <=106)) {
+			*panel = 6;
+			interimPos->y = 106;
+			walkToPos->x = 147;
+		}
+
+		if ((mousePos.y >=107) && (mousePos.y <=122)) {
+			*panel = 10;
+			interimPos->y = 122;
+			walkToPos->x = 147;
+		}
+
+		if ((mousePos.y >=123) && (mousePos.y <=137)) {
+			*panel = 14;
+			interimPos->y = 138;
+			walkToPos->x = 147;
+		}
+	}
+
+	if ((mousePos.x >= 180) && (mousePos.x <= 199)) {
+		interimPos->x = 189;
+		if ((mousePos.y >=75) && (mousePos.y <=90)) {
+			*panel = 3;
+			interimPos->y = 90;
+			walkToPos->x = 167;
+		}
+
+		if ((mousePos.y >=91) && (mousePos.y <=106)) {
+			*panel = 7;
+			interimPos->y = 106;
+			walkToPos->x = 167;
+		}
+
+		if ((mousePos.y >=107) && (mousePos.y <=122)) {
+			*panel = 11;
+			interimPos->y = 122;
+			walkToPos->x = 167;
+		}
+
+		if ((mousePos.y >=123) && (mousePos.y <=137)) {
+			*panel = 15;
+			interimPos->y = 138;
+			walkToPos->x = 167;
+		}
+	}
+}
+
+void Scene502::handlePanelAnimation() {
+	int puzzleSolvedFl = true;
+
+	switch (_game._trigger) {
+	case 110:
+		_vm->_sound->command(65);
+		_scene->deleteSequence(_puzzleSequences[_panelPushedNum]);
+		switch (_panelPushedNum) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, _puzzleSprites[_panelPushedNum] - 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+			_scene->_sequences.setTimingTrigger(5, 111);
+			break;
+
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, _puzzleSprites[_panelPushedNum] - 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+			_scene->_sequences.setTimingTrigger(5, 111);
+			break;
+
+		case 8:
+		case 9:
+		case 10:
+		case 11:
+			_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, _puzzleSprites[_panelPushedNum] - 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14);
+			_scene->_sequences.setTimingTrigger(5, 111);
+			break;
+
+		default:
+			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, _puzzleSprites[_panelPushedNum] - 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14);
+			_scene->_sequences.setTimingTrigger(5, 111);
+			break;
+		}
+		break;
+
+	case 111:
+		switch (_panelPushedNum) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			_scene->deleteSequence(_globals._sequenceIndexes[11]);
+			break;
+
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+			_scene->deleteSequence(_globals._sequenceIndexes[12]);
+			break;
+
+		case 8:
+		case 9:
+		case 10:
+		case 11:
+			_scene->deleteSequence(_globals._sequenceIndexes[13]);
+			break;
+
+		default:
+			_scene->deleteSequence(_globals._sequenceIndexes[14]);
+			break;
+		}
+
+		_globals._sequenceIndexes[16] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[16], false, 5, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[16], 14);
+		_scene->_sequences.setPosition(_globals._sequenceIndexes[16], _nextPos);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[16], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[16], 0, 0, 112);
+		break;
+
+	case 112: {
+		int idx = _globals._sequenceIndexes[16];
+		int newSprId = _puzzleSprites[_panelPushedNum] + 4;
+
+		switch (_panelPushedNum) {
+		case 0:
+		case 4:
+		case 8:
+		case 12:
+			if (newSprId > 12)
+				newSprId = 3;
+			break;
+
+		case 1:
+		case 5:
+		case 9:
+		case 13:
+			if (newSprId > 24)
+				newSprId = 15;
+			break;
+
+		case 2:
+		case 6:
+		case 10:
+		case 14:
+			if (newSprId > 36)
+				newSprId = 27;
+			break;
+
+		default:
+			if (newSprId > 48)
+				newSprId = 39;
+			break;
+		}
+
+		switch (_panelPushedNum) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, newSprId);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+			_game.syncTimers(1, _globals._sequenceIndexes[11], 1, idx);
+			_scene->_sequences.setTimingTrigger(5, 113);
+			break;
+
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, newSprId);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+			_game.syncTimers(1, _globals._sequenceIndexes[12], 1, idx);
+			_scene->_sequences.setTimingTrigger(5, 113);
+			break;
+
+		case 8:
+		case 9:
+		case 10:
+		case 11:
+			_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, newSprId);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14);
+			_game.syncTimers(1, _globals._sequenceIndexes[13], 1, idx);
+			_scene->_sequences.setTimingTrigger(5, 113);
+			break;
+
+		default:
+			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, newSprId);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14);
+			_game.syncTimers(1, _globals._sequenceIndexes[14], 1, idx);
+			_scene->_sequences.setTimingTrigger(5, 113);
+			break;
+		}
+		}
+		break;
+
+	case 113: {
+		switch (_panelPushedNum) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			_scene->deleteSequence(_globals._sequenceIndexes[11]);
+			break;
+
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+			_scene->deleteSequence(_globals._sequenceIndexes[12]);
+			break;
+
+		case 8:
+		case 9:
+		case 10:
+		case 11:
+			_scene->deleteSequence(_globals._sequenceIndexes[13]);
+			break;
+
+		default:
+			_scene->deleteSequence(_globals._sequenceIndexes[14]);
+			break;
+		}
+
+		int newSprId = _puzzleSprites[_panelPushedNum] + 3;
+
+		switch (_panelPushedNum) {
+		case 0:
+		case 4:
+		case 8:
+		case 12:
+			if (newSprId > 12)
+				newSprId = 2;
+			break;
+
+		case 1:
+		case 5:
+		case 9:
+		case 13:
+			if (newSprId > 24)
+				newSprId = 14;
+			break;
+
+		case 2:
+		case 6:
+		case 10:
+		case 14:
+			if (newSprId > 36)
+				newSprId = 26;
+			break;
+
+		default:
+			if (newSprId > 48)
+				newSprId = 38;
+			break;
+		}
+		_puzzleSprites[_panelPushedNum] = newSprId;
+		++_puzzlePictures[_panelPushedNum];
+		if (_puzzlePictures[_panelPushedNum] >= 5)
+			_puzzlePictures[_panelPushedNum] = 1;
+
+		switch (_panelPushedNum) {
+		case 0:
+		case 1:
+		case 2:
+		case 3:
+			_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, newSprId);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
+			_puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[11];
+			break;
+
+		case 4:
+		case 5:
+		case 6:
+		case 7:
+			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, newSprId);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
+			_puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[12];
+			break;
+
+		case 8:
+		case 9:
+		case 10:
+		case 11:
+			_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, newSprId);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14);
+			_puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[13];
+			break;
+
+		default:
+			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, newSprId);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14);
+			_puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[14];
+			break;
+		}
+
+		for (int i = 0; i < 16; i++) {
+			if (_puzzlePictures[i] != 1)
+				puzzleSolvedFl = false;
+		}
+
+		if (puzzleSolvedFl && !_trapDoorHotspotEnabled) {
+			_trapDoorHotspotEnabled = true;
+			_scene->deleteSequence(_globals._sequenceIndexes[6]);
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 80);
+		}
+		}
+		break;
+
+	default:
+		break;
+	}
+}
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h
index 9b07e92..c98817d 100644
--- a/engines/mads/phantom/phantom_scenes5.h
+++ b/engines/mads/phantom/phantom_scenes5.h
@@ -55,8 +55,8 @@ public:
 
 class Scene501 : public Scene5xx {
 private:
-	bool _anim_0_running;
-	bool _prevent_2;
+	bool _anim0ActvFl;
+	bool _skipFl;
 
 public:
 	Scene501(MADSEngine *vm);
@@ -69,6 +69,51 @@ public:
 	virtual void actions();
 };
 
+class Scene502 : public Scene5xx {
+private:
+	bool _fire1ActiveFl;
+	bool _fire2ActiveFl;
+	bool _fire3ActiveFl;
+	bool _fire4ActiveFl;
+	bool _panelTurningFl;
+	bool _trapDoorHotspotEnabled;
+	bool _acceleratedFireActivationFl;
+
+	int _panelPushedNum;
+	int _puzzlePictures[16];
+	int _puzzleSprites[16];
+	int _puzzleSequences[16];
+	int _messageLevel;
+	int _cycleStage;
+
+	Common::Point _nextPos;
+
+	uint32 _lastFrameTime;
+	uint32 _timer;
+	uint32 _deathTimer;
+
+	byte *_cyclePointer;
+
+	void room_502_initialize_panels();
+	void loadCyclingInfo();
+	void animateFireBursts();
+	void setPaletteCycle();
+	void handlePanelAnimation();
+	void getPanelInfo(Common::Point *walkToPos, int *panel, Common::Point mousePos, Common::Point *interimPos);
+
+public:
+	Scene502(MADSEngine *vm);
+	~Scene502();
+
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: dcf931f0bb651264bc096f9dac7960a602aa6148
    https://github.com/scummvm/scummvm/commit/dcf931f0bb651264bc096f9dac7960a602aa6148
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-05T19:48:36+01:00

Commit Message:
MADS: Phantom: Improve a bit Scene502::getPanelInfo

Changed paths:
    engines/mads/phantom/phantom_scenes5.cpp



diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 43eafa8..269cf45 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -1411,108 +1411,81 @@ void Scene502::setPaletteCycle() {
 void Scene502::getPanelInfo(Common::Point *walkToPos, int *panel, Common::Point mousePos, Common::Point *interimPos) {
 	walkToPos->y = 148;
 
-	if ((mousePos.x >= 120) && (mousePos.x <= 139)) {
+	if ((mousePos.x < 120) || (mousePos.y < 75) || (mousePos.y > 137))
+		return;
+
+	if (mousePos.x <= 139) {
 		interimPos->x = 129;
-		if ((mousePos.y >=75) && (mousePos.y <=90)) {
+		if (mousePos.y <= 90) {
 			*panel = 0;
 			interimPos->y = 90;
 			walkToPos->x = 107;
-		}
-
-		if ((mousePos.y >=91) && (mousePos.y <=106)) {
+		} else if (mousePos.y <= 106) {
 			*panel = 4;
 			interimPos->y = 106;
 			walkToPos->x = 107;
-		}
-
-		if ((mousePos.y >=107) && (mousePos.y <=122)) {
+		} else if (mousePos.y <= 122) {
 			*panel = 8;
 			interimPos->y = 122;
 			walkToPos->x = 107;
-		}
-
-		if ((mousePos.y >=123) && (mousePos.y <=137)) {
+		} else {
 			*panel = 12;
 			interimPos->y = 138;
 			walkToPos->x = 107;
 		}
-	}
-
-	if ((mousePos.x >= 140) && (mousePos.x <= 159)) {
+	} else if (mousePos.x <= 159) {
 		interimPos->x = 149;
-		if ((mousePos.y >=75) && (mousePos.y <=90)) {
+		if (mousePos.y <= 90) {
 			*panel = 1;
 			interimPos->y = 90;
 			walkToPos->x = 127;
-		}
-
-		if ((mousePos.y >=91) && (mousePos.y <=106)) {
+		} else if (mousePos.y <= 106) {
 			*panel = 5;
 			interimPos->y = 106;
 			walkToPos->x = 127;
-		}
-
-		if ((mousePos.y >=107) && (mousePos.y <=122)) {
+		} else if (mousePos.y <= 122) {
 			*panel = 9;
 			interimPos->y = 122;
 			walkToPos->x = 127;
-		}
-
-		if ((mousePos.y >=123) && (mousePos.y <=137)) {
+		} else {
 			*panel = 13;
 			interimPos->y = 138;
 			walkToPos->x = 127;
 		}
-	}
-
-	if ((mousePos.x >= 160) && (mousePos.x <= 179)) {
+	} else if (mousePos.x <= 179) {
 		interimPos->x = 169;
-		if ((mousePos.y >=75) && (mousePos.y <=90)) {
+		if (mousePos.y <= 90) {
 			*panel = 2;
 			interimPos->y = 90;
 			walkToPos->x = 147;
-		}
-
-		if ((mousePos.y >=91) && (mousePos.y <=106)) {
+		} else if (mousePos.y <= 106) {
 			*panel = 6;
 			interimPos->y = 106;
 			walkToPos->x = 147;
-		}
-
-		if ((mousePos.y >=107) && (mousePos.y <=122)) {
+		} else if (mousePos.y <= 122) {
 			*panel = 10;
 			interimPos->y = 122;
 			walkToPos->x = 147;
-		}
-
-		if ((mousePos.y >=123) && (mousePos.y <=137)) {
+		} else {
 			*panel = 14;
 			interimPos->y = 138;
 			walkToPos->x = 147;
 		}
-	}
-
-	if ((mousePos.x >= 180) && (mousePos.x <= 199)) {
+	} else if (mousePos.x <= 199) {
 		interimPos->x = 189;
-		if ((mousePos.y >=75) && (mousePos.y <=90)) {
+		if (mousePos.y <= 90) {
 			*panel = 3;
 			interimPos->y = 90;
 			walkToPos->x = 167;
-		}
-
-		if ((mousePos.y >=91) && (mousePos.y <=106)) {
+		} else if (mousePos.y <= 106) {
 			*panel = 7;
 			interimPos->y = 106;
 			walkToPos->x = 167;
-		}
-
-		if ((mousePos.y >=107) && (mousePos.y <=122)) {
+		} else if (mousePos.y <= 122) {
 			*panel = 11;
 			interimPos->y = 122;
 			walkToPos->x = 167;
-		}
-
-		if ((mousePos.y >=123) && (mousePos.y <=137)) {
+		} else {
 			*panel = 15;
 			interimPos->y = 138;
 			walkToPos->x = 167;


Commit: 178e45f4d9847970f9ee7dcf78902fa160226e7f
    https://github.com/scummvm/scummvm/commit/178e45f4d9847970f9ee7dcf78902fa160226e7f
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-11-06T22:26:32+02:00

Commit Message:
MADS: Phantom: Initialize missing scene info so that Raoul is visible

Changed paths:
    engines/mads/scene_data.cpp



diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp
index d4610c5..f6f081a 100644
--- a/engines/mads/scene_data.cpp
+++ b/engines/mads/scene_data.cpp
@@ -176,6 +176,12 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName,
 		_width = 320;
 		_height = 156;
 
+		// TODO: Initialize correctly!
+		_yBandsEnd = 155;
+		_yBandsStart = 0;
+		_maxScale = 100;
+		_minScale = 100;
+
 		infoStream->skip(140);
 	}
 


Commit: 1b75381b988f5fe70989db8fd5420f535e337c28
    https://github.com/scummvm/scummvm/commit/1b75381b988f5fe70989db8fd5420f535e337c28
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-07T14:51:03+01:00

Commit Message:
MADS: Phantom: Implement scene 504

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/phantom/phantom_scenes5.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 8a97587..c8e4145 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -147,7 +147,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 502:	// push panel trap
 		return new Scene502(vm);
 	case 504:	// Phantom's hideout, church organ
-		return new DummyScene(vm);	// TODO
+		return new Scene504(vm);
 	case 505:	// Phantom's hideout, sarcophagus
 		return new DummyScene(vm);	// TODO
 	case 506:	// catacomb room with ramp
diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index caf3906..4afa6e6 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -71,6 +71,8 @@ enum Verb {
 	VERB_WALK_BEHIND = 0xF3,
 	VERB_CLIMB = 0x120,
 	VERB_GRAPPLE = 0x133,
+	VERB_SIT_ON = 0x138,
+	VERB_SIT_IN = 0x13A,
 	VERB_WALK_DOWN_STAIRS_TO = 0x153
 };
 
@@ -350,9 +352,7 @@ enum Noun {
 	NOUN_ORGAN = 0x135,
 	NOUN_SIT_AT = 0x136,
 	NOUN_ORGAN_BENCH = 0x137,
-	NOUN_SIT_ON = 0x138,
 	NOUN_LARGE_CHAIR = 0x139,
-	NOUN_SIT_IN = 0x13A,
 	NOUN_SARCOPHAGUS = 0x13B,
 	NOUN_SKULL = 0x13C,
 	NOUN_SKULLS = 0x13D,
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 269cf45..6175254 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -819,7 +819,7 @@ void Scene502::step() {
 		}
 	}
 
-	if ((_deathTimer >= 7200)  && !_panelTurningFl) {
+	if ((_deathTimer >= 7200) && !_panelTurningFl) {
 		_vm->_dialogs->show(50215);
 		_game._player.walk(Common::Point(160, 148), FACING_NORTH);
 		_game._player.setWalkTrigger(71);
@@ -1057,34 +1057,34 @@ void Scene502::actions() {
 	if (_action.isAction(VERB_THROW, NOUN_ROPE_WITH_HOOK, NOUN_TRAP_DOOR) || _action.isAction(VERB_GRAPPLE, NOUN_TRAP_DOOR)) {
 		if (_trapDoorHotspotEnabled) {
 			switch (_game._trigger) {
-		case 0:
-			_game._player._stepEnabled = false;
-			_game._player._visible = false;
-			_panelTurningFl = true;
-			_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1);
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 13);
-			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 82);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 10, 83);
-			_game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE);
-			break;
-
-		case 82:
-			_game._player._stepEnabled = true;
-			_game._player._visible = true;
-			_panelTurningFl = false;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
-			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
-			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 13);
-			_scene->_hotspots.activate(NOUN_ROPE, true);
-			break;
-
-		case 83:
-			_vm->_sound->command(69);
-			break;
-
-		default:
-			break;
+			case 0:
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_panelTurningFl = true;
+				_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 13);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 82);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 10, 83);
+				_game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE);
+				break;
+
+			case 82:
+				_game._player._stepEnabled = true;
+				_game._player._visible = true;
+				_panelTurningFl = false;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+				_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 13);
+				_scene->_hotspots.activate(NOUN_ROPE, true);
+				break;
+
+			case 83:
+				_vm->_sound->command(69);
+				break;
+
+			default:
+				break;
 			}
 		} else
 			_vm->_dialogs->show(50229);
@@ -1151,7 +1151,6 @@ void Scene502::actions() {
 
 		if (_action.isObject(NOUN_TRAP_DOOR)) {
 			_vm->_dialogs->show(_trapDoorHotspotEnabled ? 50220 : 50225);
-
 			_action._inProgress = false;
 			return;
 		}
@@ -1186,7 +1185,8 @@ void Scene502::actions() {
 			return;
 		}
 
-		if (_action.isObject(NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE) && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
+		if (_action.isObject(NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE)
+		 && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
 			_vm->_dialogs->show(50233);
 			_action._inProgress = false;
 			return;
@@ -1205,7 +1205,8 @@ void Scene502::actions() {
 		return;
 	}
 
-	if (_action.isAction(VERB_TAKE, NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE) && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
+	if (_action.isAction(VERB_TAKE, NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE)
+	 && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
 		_vm->_dialogs->show(50234);
 		_action._inProgress = false;
 		return;
@@ -1764,6 +1765,1364 @@ void Scene502::handlePanelAnimation() {
 		break;
 	}
 }
+
+/*------------------------------------------------------------------------*/
+
+Scene504::Scene504(MADSEngine *vm) : Scene5xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_anim3ActvFl = false;
+	_anim4ActvFl = false;
+	_anim5ActvFl = false;
+	_playingMusicFl = false;
+	_chairDialogDoneFl = false;
+	_fireBreathFl = false;
+
+	_songNum = -1;
+	_input3Count = -1;
+	_playCount = -1;
+	_listenStatus = -1;
+	_listenFrame = -1;
+	_chairStatus = -1;
+	_chairFrame = -1;
+	_playStatus = -1;
+	_playFrame = -1;
+	_phantomStatus = -1;
+	_phantomFrame = -1;
+	_christineTalkCount = -1;
+	_deathCounter = -1;
+}
+
+void Scene504::synchronize(Common::Serializer &s) {
+	Scene5xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_anim3ActvFl);
+	s.syncAsByte(_anim4ActvFl);
+	s.syncAsByte(_anim5ActvFl);
+	s.syncAsByte(_playingMusicFl);
+	s.syncAsByte(_chairDialogDoneFl);
+	s.syncAsByte(_fireBreathFl);
+
+	s.syncAsSint16LE(_songNum);
+	s.syncAsSint16LE(_input3Count);
+	s.syncAsSint16LE(_playCount);
+	s.syncAsSint16LE(_listenStatus);
+	s.syncAsSint16LE(_listenFrame);
+	s.syncAsSint16LE(_chairStatus);
+	s.syncAsSint16LE(_chairFrame);
+	s.syncAsSint16LE(_playStatus);
+	s.syncAsSint16LE(_playFrame);
+	s.syncAsSint16LE(_phantomStatus);
+	s.syncAsSint16LE(_phantomFrame);
+	s.syncAsSint16LE(_christineTalkCount);
+	s.syncAsSint16LE(_deathCounter);
+}
+
+void Scene504::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_PHANTOM);
+	_scene->addActiveVocab(NOUN_CHRISTINE);
+}
+
+void Scene504::enter() {
+	_vm->_disableFastwalk = true;
+
+	_input3Count = 0;
+	_deathCounter = 0;
+	_anim2ActvFl = false;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_playCount = 0;
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim3ActvFl = false;
+		_anim4ActvFl = false;
+		_anim5ActvFl = false;
+		_playingMusicFl = false;
+		_fireBreathFl = false;
+		_chairDialogDoneFl = false;
+		_songNum = 0;
+		_phantomStatus = 0;
+	}
+
+	_scene->_hotspots.activate(NOUN_CHRISTINE, false);
+
+	if (!_globals[kRightDoorIsOpen504]) {
+		_vm->_gameConv->get(19);
+		_vm->_gameConv->get(27);
+	} else
+		_vm->_gameConv->get(21);
+
+	_vm->_gameConv->get(26);
+
+	_globals._spriteIndexes[14] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('x', 8), false);
+
+	if (!_game._objects.isInRoom(OBJ_MUSIC_SCORE)) {
+		_globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[15], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14);
+		_scene->_hotspots.activate(NOUN_MUSIC_SCORE, false);
+	}
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+	if (_globals[kFightStatus] == 0)
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+
+	if ((_scene->_priorSceneId == 505) || ((_scene->_priorSceneId == 504) && _globals[kRightDoorIsOpen504])) {
+		if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2)) {
+			_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+
+			_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0), false);
+
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+			_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5), false);
+			_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 6), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 1), 0);
+			int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_PHANTOM, VERB_LOOK_AT, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(-2, -2), FACING_NONE);
+
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 8);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 13);
+
+			_phantomStatus = 0;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_anim3ActvFl = true;
+		} else {
+			if (_globals[kFightStatus])
+				_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+
+			if (_globals[kCoffinStatus] != 2) {
+				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+			}
+
+			_game._player._playerPos = Common::Point(317, 115);
+			_game._player._facing = FACING_SOUTHWEST;
+			_game._player.walk(Common::Point(279, 121), FACING_SOUTHWEST);
+
+			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+
+			if (!_game._visitedScenes.exists(506) && (_globals[kCoffinStatus] == 2)) {
+				_scene->changeVariant(1);
+
+				_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+				_anim5ActvFl = true;
+
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", false);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR",PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+				_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0);
+				int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+				_phantomStatus = 5;
+				_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+				_scene->setAnimFrame(_globals._animationIndexes[3], 79);
+				_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4);
+			}
+		}
+	} else if (_scene->_priorSceneId == 506) {
+		_game._player._playerPos = Common::Point(0, 109);
+		_game._player._facing = FACING_SOUTHEAST;
+		_game._player.walk(Common::Point(39, 118), FACING_SOUTHEAST);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+	} else if (_scene->_priorSceneId == 504) {
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+
+		_game._player._playerPos = Common::Point(147, 131);
+		_game._player._facing = FACING_EAST;
+	} else if ((_scene->_priorSceneId == 502) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 60);
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_game._player._playerPos = Common::Point(147, 131);
+		_game._player._facing = FACING_EAST;
+	}
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		if (!_globals[kRightDoorIsOpen504]) {
+			_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+		}
+
+		if (_vm->_gameConv->_restoreRunning == 19) {
+			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 67);
+			_anim0ActvFl = true;
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+			_game._player._playerPos = Common::Point(286, 120);
+			_game._player._facing = FACING_EAST;
+			_listenStatus = 0;
+			_scene->setAnimFrame(_globals._animationIndexes[0], 8);
+			_vm->_gameConv->run(19);
+			_vm->_gameConv->exportValue(_game._difficulty);
+		} else if (_vm->_gameConv->_restoreRunning == 27) {
+			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+
+			_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('o', 1), 100);
+
+			_scene->setAnimFrame(_globals._animationIndexes[1], 22);
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_playingMusicFl = false;
+			_anim1ActvFl = true;
+			_playStatus = 0;
+			_vm->_gameConv->run(27);
+		} else if ((_globals[kFightStatus] <= 1) && (_globals[kCoffinStatus] == 2)) {
+			if ((_phantomStatus == 1) || (_phantomStatus == 2)) {
+				_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+				_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0), false);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+				_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5), false);
+				_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 6), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+				_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 1), 0);
+				int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_PHANTOM, VERB_LOOK_AT, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
+				_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+				_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(-2, -2), FACING_NONE);
+
+				if (_phantomStatus == 1)
+					_scene->setAnimFrame(_globals._animationIndexes[3], _vm->getRandomNumber(109, 112));
+				else if (_phantomStatus == 2) {
+					_scene->setAnimFrame(_globals._animationIndexes[3], _vm->getRandomNumber(148, 150));
+					_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+				}
+
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 8);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 13);
+
+				_game._player._visible = false;
+				_anim3ActvFl = true;
+
+				if (_vm->_gameConv->_restoreRunning == 21) {
+					_game._player._stepEnabled = false;
+					_vm->_gameConv->run(21);
+					_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE));
+				}
+			} else if (_phantomStatus == 4) {
+				_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+				_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", false);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 8), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+				_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 2), 130);
+				_scene->setAnimFrame(_globals._animationIndexes[3], 159);
+
+				_game._player._playerPos = Common::Point(130, 135);
+				_game._player._facing = FACING_NORTHEAST;
+				_game._player._visible = true;
+				_anim4ActvFl = true;
+
+				_game._player._stepEnabled = false;
+				_vm->_gameConv->run(21);
+				_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE));
+			}
+		} else if (_globals[kFightStatus] == 2) {
+			if (!_game._visitedScenes.exists(506)) {
+				_scene->changeVariant(1);
+
+				_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+				_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+				_anim5ActvFl = true;
+
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", false);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR",PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+				_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0);
+				int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+				_phantomStatus = 5;
+				_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+				_scene->setAnimFrame(_globals._animationIndexes[3], 79);
+				_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4);
+			} else {
+				_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+				_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+			}
+		} else {
+			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+			if (!_globals[kHeListened])
+				_scene->_sequences.setTimingTrigger(30, 62);
+		}
+	}
+
+	sceneEntrySound();
+}
+
+void Scene504::step() {
+	if (_anim0ActvFl)
+		handleListenAnimation();
+
+	if (_anim1ActvFl)
+		handleOrganAnimation();
+
+	if (_anim2ActvFl)
+		handleChairAnimation();
+
+	if (_anim3ActvFl)
+		handlePhantomAnimation1();
+
+	if (_anim4ActvFl)
+		handlePhantomAnimation2();
+
+	if (_anim5ActvFl)
+		handlePhantomAnimation3();
+
+	if (_game._trigger == 120) {
+		_game._player._stepEnabled = false;
+		_vm->_gameConv->run(21);
+		_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE));
+		_vm->_gameConv->exportValue(1);
+		_globals[kFightStatus] = 1;
+	}
+
+	if (_game._trigger == 60) {
+		_game._player._visible = true;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->_sequences.setTimingTrigger(30, 61);
+	}
+
+	if (_game._trigger == 61) {
+		_game._player._stepEnabled = true;
+		_scene->_sequences.setTimingTrigger(60, 62);
+	}
+
+	if (_game._trigger == 62) {
+		_globals[kHeListened] = true;
+		_game._player._stepEnabled = false;
+		_vm->_gameConv->run(19);
+		_vm->_gameConv->exportValue(_game._difficulty);
+	}
+
+	if (_game._trigger == 80) {
+		_vm->_sound->command(73);
+		_globals[kRightDoorIsOpen504] = true;
+		_scene->deleteSequence(_globals._sequenceIndexes[2]);
+		_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 90);
+	}
+
+	if (_game._trigger == 90) {
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 91);
+	}
+
+	if (_game._trigger == 91) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 92);
+	}
+
+	if (_game._trigger == 92)
+		_fireBreathFl = true;
+
+	if (_fireBreathFl) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
+		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
+		_fireBreathFl = false;
+	}
+
+	if (_game._trigger == 130) {
+		_scene->freeAnimation(_globals._animationIndexes[3]);
+		_scene->_sprites.remove(_globals._spriteIndexes[12]);
+
+		_anim4ActvFl = false;
+		_anim5ActvFl = true;
+
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+		_scene->changeVariant(1);
+
+		_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0);
+		int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+		_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST);
+		_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0);
+		_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1);
+		_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2);
+		_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3);
+		_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4);
+	}
+
+	if (_game._trigger == 67) {
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		_anim0ActvFl = false;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+	}
+
+	if (_game._trigger == 136)
+		_scene->_nextSceneId = 506;
+
+	if (_game._trigger == 100) {
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game._player._playerPos = Common::Point(156, 114);
+		_game._player._visible = true;
+		_anim1ActvFl = false;
+		_game._player.resetFacing(FACING_EAST);
+		_scene->_sequences.setTimingTrigger(10, 101);
+	}
+
+	if (_game._trigger == 101) {
+		_game._player._stepEnabled = true;
+		_scene->_sprites.remove(_globals._spriteIndexes[5]);
+		_scene->_sprites.remove(_globals._spriteIndexes[4]);
+	}
+}
+
+void Scene504::actions() {
+	if (_vm->_gameConv->_running == 26) {
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_SIT_IN, NOUN_LARGE_CHAIR)) {
+		if (!_anim2ActvFl) {
+			_chairStatus = 0;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_anim2ActvFl = true;
+			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('c', 1), 0);
+			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+		} else
+			_vm->_dialogs->show(50436);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_game._trigger == 95) {
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 67);
+		_listenStatus = 0;
+		_game._player._stepEnabled = false;
+		_game._player._visible = false;
+		_anim0ActvFl = true;
+		_globals[kHeListened] = true;
+		_vm->_gameConv->run(19);
+		_vm->_gameConv->exportValue(_game._difficulty);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_game._trigger == 67) {
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		_anim0ActvFl = false;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 19) {
+		handleListenConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 27) {
+		handlePlayConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 21) {
+		handleFightConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_game._trigger == 100) {
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game._player._playerPos = Common::Point(156, 114);
+		_game._player._visible = true;
+		_anim1ActvFl = false;
+		_game._player.resetFacing(FACING_EAST);
+		_scene->_sequences.setTimingTrigger(10, 101);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_game._trigger == 101) {
+		_game._player._stepEnabled = true;
+		_scene->_sprites.remove(_globals._spriteIndexes[5]);
+		_scene->_sprites.remove(_globals._spriteIndexes[4]);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_SIT_ON, NOUN_ORGAN_BENCH)) {
+		if (_globals[kRightDoorIsOpen504])
+			_vm->_dialogs->show(50427);
+		else {
+			_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('o', 1), 100);
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_playingMusicFl = false;
+			_anim1ActvFl = true;
+			_playStatus = 0;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) {
+		if (_globals[kRightDoorIsOpen504]) {
+			if (_vm->_gameConv->_running == 26)
+				_vm->_gameConv->abortConv();
+
+			_scene->_nextSceneId = 505;
+		} else
+			_vm->_dialogs->show(50418);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) {
+		if (_globals[kFightStatus]) {
+			if (_game._visitedScenes.exists(506))
+				_scene->_nextSceneId = 506;
+			else if (!_game._objects.isInInventory(OBJ_MUSIC_SCORE))
+				_vm->_dialogs->show(50425);
+			else {
+				_phantomStatus = 6;
+				_game._player._stepEnabled = false;
+			}
+		} else
+			_vm->_dialogs->show(50418);
+
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_MUSIC_SCORE)) {
+		switch (_game._trigger) {
+		case (0):
+			if (_game._objects.isInRoom(OBJ_MUSIC_SCORE)) {
+				_globals[kPlayerScore] += 5;
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[14] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[14], false, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[14], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[14], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[14], 2, 4, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[14], 0, 0, 2);
+				_action._inProgress = false;
+				return;
+			}
+			break;
+
+		case 1:
+			_globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[15], false, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14);
+			_scene->_hotspots.activate(NOUN_MUSIC_SCORE, false);
+			_game._objects.addToInventory(OBJ_MUSIC_SCORE);
+			_vm->_sound->command(26);
+			_action._inProgress = false;
+			return;
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[14]);
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			_action._inProgress = false;
+			return;
+			break;
+
+		case 3:
+			_vm->_dialogs->showItem(OBJ_MUSIC_SCORE, 820, 0);
+			_game._player._stepEnabled = true;
+			_action._inProgress = false;
+			return;
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(50410);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(50411);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(50412);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ORGAN)) {
+			_vm->_dialogs->show(50413);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_ORGAN_BENCH)) {
+			_vm->_dialogs->show(50414);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_MUSIC_SCORE) && _game._objects.isInRoom(OBJ_MUSIC_SCORE)) {
+			_vm->_dialogs->show(50415);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LEFT_DOOR)) {
+			_vm->_dialogs->show(50416);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RIGHT_DOOR)) {
+			_vm->_dialogs->show(_globals[kRightDoorIsOpen504] ? 50434 : 50417);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TABLE)) {
+			_vm->_dialogs->show(50419);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TRAP_DOOR)) {
+			_vm->_dialogs->show(50420);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LARGE_CHAIR)) {
+			_vm->_dialogs->show(50422);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHRISTINE)) {
+			_vm->_dialogs->show(_globals[kFightStatus] ? 50426 : 50429);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_PHANTOM)) {
+			_vm->_dialogs->show(50428);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) {
+		_vm->_dialogs->show(50421);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE) && _action.isObject(NOUN_RIGHT_DOOR) && !_globals[kRightDoorIsOpen504]) {
+		_vm->_dialogs->show(50433);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_CLOSE) && _action.isObject(NOUN_LEFT_DOOR) && !_globals[kFightStatus] && !_game._visitedScenes.exists(506)) {
+		_vm->_dialogs->show(50433);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_anim3ActvFl && (_action.isAction(VERB_TAKE, NOUN_SWORD) || _action.isAction(VERB_ATTACK, NOUN_PHANTOM))) {
+		_game._player._stepEnabled = false;
+		_input3Count = 0;
+		_phantomStatus = 4;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) {
+		_vm->_gameConv->run(21);
+		_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE));
+		_vm->_gameConv->exportValue(0);
+		_phantomStatus = 7;
+		_christineTalkCount = 0;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_PHANTOM)) {
+		_vm->_dialogs->show(50431);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) {
+		_vm->_dialogs->show(50435);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene504::preActions() {
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) {
+		if (_globals[kRightDoorIsOpen504]) {
+			if ((_globals[kFightStatus] == 2) && !_game._visitedScenes.exists(506)) {
+				switch (_game._trigger) {
+				case 0:
+					_game._player.walk(Common::Point(317, 115), FACING_NORTHEAST);
+					_game._player._readyToWalk = false;
+					_game._player._needToWalk = false;
+					_game._player._stepEnabled = false;
+					_vm->_gameConv->run(26);
+					_vm->_gameConv->exportValue(2);
+					_scene->_sequences.setTimingTrigger(6, 1);
+					break;
+
+				case 1:
+					if (_vm->_gameConv->_running >= 0)
+						_scene->_sequences.setTimingTrigger(6, 1);
+					else {
+						_game._player._stepEnabled = true;
+						_action._inProgress = true;
+						_game._player._needToWalk = true;
+						_game._player._readyToWalk = true;
+					}
+					break;
+
+				default:
+					break;
+				}
+			} else
+				_game._player.walk(Common::Point(317, 115), FACING_NORTHEAST);
+		} else if (_globals[kHeListened] || (_globals[kFightStatus] == 0))
+			_game._player.walk(Common::Point(286, 120), FACING_NORTHEAST);
+	}
+
+	if (_anim2ActvFl && !_action.isAction(VERB_SIT_IN) && _game._player._needToWalk) {
+		_chairStatus = 1;
+		_game._player._stepEnabled = false;
+		_game._player._readyToWalk = false;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) {
+		if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506)) {
+			_vm->_dialogs->show(50432);
+			_game._player.cancelCommand();
+			return;
+		} else if (_game._visitedScenes.exists(506))
+			_game._player.walk(Common::Point(0, 109), FACING_NORTHWEST);
+		else if (!_game._objects.isInInventory(OBJ_MUSIC_SCORE) || (_globals[kFightStatus] == 0))
+			_game._player.walk(Common::Point(33, 116), FACING_NORTHWEST);
+	}
+
+	if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506)
+	 && !_action.isAction(VERB_LOOK) && !_action.isAction(VERB_LOOK_AT) && !_action.isAction(VERB_ATTACK)
+	 && !_action.isAction(VERB_TAKE, NOUN_SWORD) && !_action.isAction(VERB_TALK_TO, NOUN_PHANTOM)) {
+		_vm->_dialogs->show(50430);
+		_game._player.cancelCommand();
+	}
+}
+
+void Scene504::handleListenAnimation() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	if (curFrame == _listenFrame)
+		return;
+
+	_listenFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_listenFrame) {
+	case 8:
+		_vm->_gameConv->release();
+		break;
+
+	case 9:
+		resetFrame = (_listenStatus == 0) ? 8 : 9;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_listenFrame = resetFrame;
+	}
+}
+
+void Scene504::handleOrganAnimation() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	if (curFrame == _playFrame)
+		return;
+
+	_playFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_playFrame) {
+	case 22:
+		_game._player._stepEnabled = true;
+		_vm->_gameConv->run(27);
+		break;
+
+	case 23:
+		if (_playStatus == 0)
+			resetFrame = 22;
+		else {
+			_game._player._stepEnabled = false;
+			if (_songNum == 5) {
+				_playingMusicFl = false;
+				_fireBreathFl = false;
+				resetFrame = 104;
+			}
+		}
+		break;
+
+	case 28:
+		if (!_playingMusicFl) {
+			_playingMusicFl = true;
+			_fireBreathFl = true;
+			_game._player._stepEnabled = false;
+
+			switch (_songNum) {
+			case 1:
+				_vm->_sound->command(34);
+				break;
+
+			case 2:
+				_vm->_sound->command(37);
+				break;
+
+			case 3:
+				_vm->_sound->command(35);
+				break;
+
+			case 4:
+				_vm->_sound->command(36);
+				break;
+
+			default:
+				break;
+			}
+		}
+		break;
+
+	case 69:
+		if ((_globals[kRightDoorIsOpen504]) && (_playCount >= 2)) {
+			_playCount = 0;
+			resetFrame = 102;
+			_vm->_sound->command(2);
+			_vm->_sound->command(16);
+		} else if (_songNum != _globals[kMusicSelected]) {
+			_vm->_sound->command(2);
+			_fireBreathFl = true;
+			resetFrame = 75;
+		} else {
+			resetFrame = 25;
+			++_playCount;
+			if (!_globals[kRightDoorIsOpen504]) {
+				_scene->_sequences.setTimingTrigger(1, 80);
+				_globals[kPlayerScore] += 5;
+			}
+		}
+		break;
+
+	case 76:
+		_scene->playSpeech(7);
+		break;
+
+	case 90:
+		_vm->_sound->command(27);
+		break;
+
+	case 102:
+		++_deathCounter;
+		if (_deathCounter >= 17)
+			_scene->_reloadSceneFlag = true;
+		else
+			resetFrame = 101;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_playFrame = resetFrame;
+	}
+}
+
+void Scene504::handlePhantomAnimation1() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame();
+	if (curFrame == _phantomFrame)
+		return;
+
+	_phantomFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_phantomFrame) {
+	case 41:
+		_vm->_gameConv->run(21);
+		_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE));
+		_vm->_gameConv->exportValue(0);
+		break;
+
+	case 52:
+	case 53:
+	case 54:
+	case 55:
+		resetFrame = (_phantomStatus == 0) ? _vm->getRandomNumber(51, 54) : 55;
+		break;
+
+	case 78:
+		_vm->_gameConv->release();
+		break;
+
+	case 110:
+	case 111:
+	case 112:
+	case 113:
+		resetFrame = (_phantomStatus == 1) ? _vm->getRandomNumber(109, 112) : 113;
+		break;
+
+	case 142:
+		_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
+		break;
+
+	case 143:
+		_game._player._stepEnabled = true;
+		break;
+
+	case 149:
+	case 150:
+	case 151:
+		++_input3Count;
+
+		if (_phantomStatus == 4) {
+			_game._player._stepEnabled = false;
+			resetFrame = 200;
+		} else if (_input3Count >= 9) {
+			_game._player._stepEnabled = false;
+			resetFrame = 151;
+		} else if (_phantomStatus == 2)
+			resetFrame = _vm->getRandomNumber(148, 150);
+		break;
+
+	case 169:
+		_vm->_sound->command(1);
+		_scene->playSpeech(7);
+		break;
+
+	case 180:
+		_vm->_sound->command(27);
+		break;
+
+	case 187:
+		_deathCounter = 0;
+		break;
+
+	case 189:
+		++_deathCounter;
+		if (_deathCounter >= 29)
+			_scene->_reloadSceneFlag = true;
+		else
+			resetFrame = 188;
+		break;
+
+	case 227:
+
+		_scene->freeAnimation(_globals._animationIndexes[3]);
+		_scene->_sprites.remove(_globals._spriteIndexes[9]);
+		_scene->_sprites.remove(_globals._spriteIndexes[8]);
+		_scene->_sprites.remove(_globals._spriteIndexes[7]);
+		_scene->_sprites.remove(_globals._spriteIndexes[10]);
+		_scene->_sprites.remove(_globals._spriteIndexes[11]);
+
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+		_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 8), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+		_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 2), 130);
+
+		_scene->setAnimFrame(_globals._animationIndexes[3], 27);
+		resetFrame = -1;
+		_anim3ActvFl = false;
+		_anim4ActvFl = true;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[3], resetFrame);
+		_phantomFrame = resetFrame;
+	}
+}
+
+void Scene504::handlePhantomAnimation2() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame();
+	if (curFrame == _phantomFrame)
+		return;
+
+	_phantomFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_phantomFrame) {
+	case 78:
+		_scene->playSpeech(9);
+		break;
+
+	case 119:
+		_game._player._playerPos = Common::Point(114, 137);
+		_game._player._facing = FACING_WEST;
+		_game._player._visible = true;
+		_globals[kPlayerScore] += 5;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[3]);
+		_game._player.walk(Common::Point(130, 135), FACING_NORTHEAST);
+		_scene->_hotspots.activate(NOUN_CHRISTINE, false);
+		_game._player.setWalkTrigger(120);
+		_vm->_sound->command(1);
+		break;
+
+	case 150:
+		_vm->_sound->command(16);
+		break;
+
+	case 160:
+		switch (_playStatus) {
+		case 5:
+			resetFrame = 164;
+			break;
+
+		case 7:
+			resetFrame = 160;
+			break;
+
+		default:
+			resetFrame = 159;
+			break;
+		}
+		break;
+
+	case 161:
+	case 162:
+	case 163:
+	case 164:
+		resetFrame = (_phantomStatus == 5) ? 159 : _vm->getRandomNumber(160, 162);
+
+		++_christineTalkCount;
+		if (_christineTalkCount > 10) {
+			resetFrame = 159;
+			if (_phantomStatus != 5)
+				_phantomStatus = 4;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[3], resetFrame);
+		_phantomFrame = resetFrame;
+	}
+}
+
+void Scene504::handlePhantomAnimation3() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame();
+	if (curFrame == _phantomFrame)
+		return;
+
+	_phantomFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_phantomFrame) {
+	case 58:
+		_game._player._stepEnabled = true;
+		break;
+
+	case 80:
+		if (_phantomStatus == 7)
+			resetFrame = 116;
+		else if (_phantomStatus != 6)
+			resetFrame = 79;
+		break;
+
+	case 115:
+		_game._player.walk(Common::Point(0, 109), FACING_NORTHWEST);
+		_game._player.setWalkTrigger(136);
+		break;
+
+	case 116:
+		resetFrame = 115;
+		break;
+
+	case 117:
+	case 118:
+	case 119:
+		resetFrame = _vm->getRandomNumber(116, 118);
+		++_christineTalkCount;
+		if (_christineTalkCount > 10) {
+			resetFrame = 79;
+			if (_phantomStatus != 6)
+				_phantomStatus = 5;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[3], resetFrame);
+		_phantomFrame = resetFrame;
+	}
+}
+
+void Scene504::handleChairAnimation() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
+	if (curFrame == _chairFrame)
+		return;
+
+	_chairFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_chairFrame) {
+	case 24:
+		_game._player._stepEnabled = true;
+		break;
+
+	case 25:
+	case 26:
+	case 30:
+	case 31:
+		if (!_chairDialogDoneFl) {
+			_chairDialogDoneFl = true;
+			_vm->_dialogs->show(50424);
+		}
+
+		if (_chairStatus == 0) {
+			if (_vm->getRandomNumber(1,5) == 1)
+				resetFrame = _vm->getRandomNumber(24, 30);
+			else
+				resetFrame = _chairFrame - 1;
+		} else
+			resetFrame = 31;
+		break;
+
+	case 47:
+		resetFrame = -1;
+		_game._player._stepEnabled = true;
+		_game._player._visible = true;
+		_game._player._readyToWalk = true;
+		_anim2ActvFl = false;
+		_chairDialogDoneFl = false;
+		_scene->freeAnimation(_globals._animationIndexes[2]);
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
+		_chairFrame = resetFrame;
+	}
+}
+
+void Scene504::handleListenConversation() {
+	if ((_action._activeAction._verbId == 2) && !_game._trigger) {
+		_game._player.walk(Common::Point(286, 120), FACING_EAST);
+		_game._player.setWalkTrigger(95);
+	}
+
+	if (_action._activeAction._verbId == 12)
+		_listenStatus = 1;
+}
+
+void Scene504::handlePlayConversation() {
+	switch (_action._activeAction._verbId) {
+	case 2:
+		*_vm->_gameConv->_nextStartNode = 1;
+		_vm->_gameConv->abortConv();
+		_playStatus = 1;
+		_songNum = 1;
+		break;
+
+	case 3:
+		*_vm->_gameConv->_nextStartNode = 1;
+		_vm->_gameConv->abortConv();
+		_playStatus = 1;
+		_songNum = 2;
+		break;
+
+	case 4:
+		*_vm->_gameConv->_nextStartNode = 1;
+		_vm->_gameConv->abortConv();
+		_playStatus = 1;
+		_songNum = 3;
+		break;
+
+	case 5:
+		*_vm->_gameConv->_nextStartNode = 1;
+		_vm->_gameConv->abortConv();
+		_playStatus = 1;
+		_songNum = 4;
+		break;
+
+	case 6:
+		*_vm->_gameConv->_nextStartNode = 1;
+		_vm->_gameConv->abortConv();
+		_playStatus = 1;
+		_songNum = 5;
+		break;
+
+	case 8:
+		*_vm->_gameConv->_nextStartNode = 1;
+		_vm->_gameConv->abortConv();
+		_playStatus = 1;
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene504::handleFightConversation() {
+	switch (_action._activeAction._verbId) {
+	case 3:
+		_vm->_gameConv->hold();
+		_phantomStatus = 1;
+		break;
+
+	case 8:
+		_phantomStatus = 2;
+		break;
+
+	case 10:
+	case 11:
+	case 12:
+	case 15:
+		_vm->_gameConv->setInterlocutorTrigger(145);
+		break;
+
+	case 14:
+	case 17:
+		_phantomStatus = 5;
+		_globals[kFightStatus] = 2;
+		break;
+
+	default:
+		break;
+	}
+
+	if ((_game._trigger == 145) && (_phantomStatus != 5)) {
+		_phantomStatus = 7;
+		_christineTalkCount = 0;
+	}
+}
+
 /*------------------------------------------------------------------------*/
 
 } // End of namespace Phantom
diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h
index c98817d..044e604 100644
--- a/engines/mads/phantom/phantom_scenes5.h
+++ b/engines/mads/phantom/phantom_scenes5.h
@@ -114,6 +114,53 @@ public:
 	virtual void actions();
 };
 
+class Scene504 : public Scene5xx {
+private:
+  bool _anim0ActvFl;
+  bool _anim1ActvFl;
+  bool _anim2ActvFl;
+  bool _anim3ActvFl;
+  bool _anim4ActvFl;
+  bool _anim5ActvFl;
+  bool _playingMusicFl;
+  bool _chairDialogDoneFl;
+  bool _fireBreathFl;
+
+  int _songNum;
+  int _input3Count;
+  int _playCount;
+  int _listenStatus;
+  int _listenFrame;
+  int _chairStatus;
+  int _chairFrame;
+  int _playStatus;
+  int _playFrame;
+  int _phantomStatus;
+  int _phantomFrame;
+  int _christineTalkCount;
+  int _deathCounter;
+
+  void handleListenAnimation();
+  void handleOrganAnimation();
+  void handleChairAnimation();
+  void handlePhantomAnimation1();
+  void handlePhantomAnimation2();
+  void handlePhantomAnimation3();
+  void handleListenConversation();
+  void handlePlayConversation();
+  void handleFightConversation();
+
+public:
+	Scene504(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: f6e38119ec8a8d9d7f1c28185fe68ff16692b07d
    https://github.com/scummvm/scummvm/commit/f6e38119ec8a8d9d7f1c28185fe68ff16692b07d
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-11-07T18:17:45+02:00

Commit Message:
MADS: Phantom: More work on V2 scene data

Changed paths:
    engines/mads/player.cpp
    engines/mads/scene_data.cpp



diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index 292f538..09a9618 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -304,7 +304,7 @@ void Player::update() {
 		int newDepth = 1;
 		int yp = MIN(_playerPos.y, (int16)(MADS_SCENE_HEIGHT - 1));
 
-		for (int idx = 1; idx < 15; ++idx) {
+		for (int idx = 1; idx < DEPTH_BANDS_SIZE; ++idx) {
 			if (scene._sceneInfo->_depthList[newDepth] >= yp)
 				newDepth = idx + 1;
 		}
diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp
index f6f081a..2211430 100644
--- a/engines/mads/scene_data.cpp
+++ b/engines/mads/scene_data.cpp
@@ -108,7 +108,7 @@ SceneInfo::SceneInfo(MADSEngine *vm) : _vm(vm) {
 	_minScale = 0;
 	_field4A = 0;
 	_usageIndex = 0;
-	for (int i = 0; i < 15; ++i)
+	for (int i = 0; i < DEPTH_BANDS_SIZE; ++i)
 		_depthList[i] = 0;
 }
 
@@ -145,6 +145,15 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName,
 
 	// Read in basic data
 	Common::SeekableReadStream *infoStream = infoPack.getItemStream(0);
+
+	/*
+	byte *data = new byte[infoStream->size()];
+	infoStream->read(data, infoStream->size());
+	Common::hexdump(data, infoStream->size());
+	infoStream->seek(0);
+	delete[] data;
+	*/
+
 	if (_vm->getGameID() == GType_RexNebular) {
 		_sceneId = infoStream->readUint16LE();
 	} else {
@@ -161,28 +170,28 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName,
 		_height = infoStream->readUint16LE();
 
 		infoStream->skip(24);
-
-		nodeCount = infoStream->readUint16LE();
-		_yBandsEnd = infoStream->readUint16LE();
-		_yBandsStart = infoStream->readUint16LE();
-		_maxScale = infoStream->readUint16LE();
-		_minScale = infoStream->readUint16LE();
-		for (int i = 0; i < DEPTH_BANDS_SIZE; ++i)
-			_depthList[i] = infoStream->readUint16LE();
-		_field4A = infoStream->readUint16LE();
 	} else {
 		_artFileNum = sceneId;
 		_depthStyle = 0;
 		_width = 320;
 		_height = 156;
 
-		// TODO: Initialize correctly!
-		_yBandsEnd = 155;
-		_yBandsStart = 0;
-		_maxScale = 100;
-		_minScale = 100;
+		infoStream->skip(98);
+	}
 
-		infoStream->skip(140);
+	nodeCount = infoStream->readUint16LE();
+	_yBandsEnd = infoStream->readUint16LE();
+	_yBandsStart = infoStream->readUint16LE();
+	_maxScale = infoStream->readUint16LE();
+	_minScale = infoStream->readUint16LE();
+	for (int i = 0; i < DEPTH_BANDS_SIZE; ++i)
+		_depthList[i] = infoStream->readUint16LE();
+	_field4A = infoStream->readUint16LE();
+
+	// HACK for V2 games
+	if (_vm->getGameID() != GType_RexNebular) {
+		_minScale = _maxScale = 100;
+		memset(_depthList, 0, DEPTH_BANDS_SIZE * sizeof(int));
 	}
 
 	// Load the scene's walk nodes
@@ -190,27 +199,29 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName,
 		WalkNode node;
 		node.load(infoStream);
 
-		if (i < nodeCount)
+		if (i < nodeCount) {
 			_nodes.push_back(node);
+			//debug("Node %d: %d,%d", i, node._walkPos.x, node._walkPos.y);
+		}
 	}
 
-	int spriteSetsCount  = infoStream->readUint16LE();
-	int spriteInfoCount = infoStream->readUint16LE();
-
-	// Load in sprite sets
 	Common::StringArray setNames;
-	for (int i = 0; i < 10; ++i) {
-		char name[64];
-		infoStream->read(name, 64);
-
-		if (i < spriteSetsCount)
-			setNames.push_back(Common::String(name));
-	}
-
-	// Load in sprite draw information
 	Common::Array<SpriteInfo> spriteInfo;
-	// TODO: The following isn't quite right for V2 games
+
 	if (_vm->getGameID() == GType_RexNebular) {
+		int spriteSetsCount = infoStream->readUint16LE();
+		int spriteInfoCount = infoStream->readUint16LE();
+
+		// Load in sprite sets
+		for (int i = 0; i < 10; ++i) {
+			char name[64];
+			infoStream->read(name, 64);
+
+			if (i < spriteSetsCount)
+				setNames.push_back(Common::String(name));
+		}
+
+		// Load in sprite draw information
 		for (int i = 0; i < 50; ++i) {
 			SpriteInfo info;
 			info.load(infoStream);
@@ -218,6 +229,12 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName,
 			if (i < spriteInfoCount)
 				spriteInfo.push_back(info);
 		}
+	} else {
+		uint16 shadowColors = infoStream->readUint16LE();
+		uint16 shadowR = infoStream->readUint16LE();
+		uint16 shadowG = infoStream->readUint16LE();
+		uint16 shadowB = infoStream->readUint16LE();
+		debug("Shadow colors: %d (%d, %d, %d)", shadowColors, shadowR, shadowG, shadowB);
 	}
 	delete infoStream;
 


Commit: 41a6750d9628aa5fb28397984c58e232ab11eb71
    https://github.com/scummvm/scummvm/commit/41a6750d9628aa5fb28397984c58e232ab11eb71
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-08T19:10:24+01:00

Commit Message:
MADS: Phantom: Implement scene 505

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/phantom/phantom_scenes5.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index c8e4145..293ed3a 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -149,7 +149,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 504:	// Phantom's hideout, church organ
 		return new Scene504(vm);
 	case 505:	// Phantom's hideout, sarcophagus
-		return new DummyScene(vm);	// TODO
+		return new Scene505(vm);
 	case 506:	// catacomb room with ramp
 		return new DummyScene(vm);	// TODO
 
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 6175254..6c3d037 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -430,8 +430,8 @@ void Scene501::actions() {
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
 					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
 					_vm->_sound->command(24);
-						 }
-						 break;
+					}
+					break;
 
 				case 66:
 					_game._player.walk(Common::Point(319, 116), FACING_NORTHWEST);
@@ -3125,5 +3125,786 @@ void Scene504::handleFightConversation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene505::Scene505(MADSEngine *vm) : Scene5xx(vm) {
+	_anim0ActvFl = false;
+	_anim1ActvFl = false;
+	_anim2ActvFl = false;
+	_checkFrame106 = false;
+	_leaveRoomFl = false;
+	_partedFl = false;
+
+	_raoulStatus = -1;
+	_raoulFrame = -1;
+	_raoulCount = -1;
+	_bothStatus = -1;
+	_bothFrame = -1;
+	_bothCount = -1;
+	_partStatus = -1;
+	_partFrame = -1;
+	_partCount = -1;
+}
+
+void Scene505::synchronize(Common::Serializer &s) {
+	Scene5xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_anim1ActvFl);
+	s.syncAsByte(_anim2ActvFl);
+	s.syncAsByte(_checkFrame106);
+	s.syncAsByte(_leaveRoomFl);
+	s.syncAsByte(_partedFl);
+
+	s.syncAsSint16LE(_raoulStatus);
+	s.syncAsSint16LE(_raoulFrame);
+	s.syncAsSint16LE(_raoulCount);
+	s.syncAsSint16LE(_bothStatus);
+	s.syncAsSint16LE(_bothFrame);
+	s.syncAsSint16LE(_bothCount);
+	s.syncAsSint16LE(_partStatus);
+	s.syncAsSint16LE(_partFrame);
+	s.syncAsSint16LE(_partCount);
+}
+
+void Scene505::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	if ((_globals[kCoffinStatus] == 2) && (!_globals[kChrisLeft505]))
+		_scene->_initialVariant = 1;
+
+	_scene->addActiveVocab(NOUN_CHRISTINE);
+}
+
+void Scene505::enter() {
+	_vm->_disableFastwalk = true;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_partedFl = false;
+		_leaveRoomFl = false;
+		_anim0ActvFl = false;
+		_anim1ActvFl = false;
+		_anim2ActvFl = false;
+		_checkFrame106 = false;
+	}
+
+	_vm->_gameConv->get(20);
+	_scene->_hotspots.activateAtPos(NOUN_LID, false, Common::Point(216, 44));
+	_scene->_hotspots.activate(NOUN_CHRISTINE, false);
+
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 6), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 5), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 4), false);
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		if (_vm->_gameConv->_restoreRunning == 20) {
+			_scene->_hotspots.activate(NOUN_LID, false);
+			_scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44));
+			_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65);
+			_scene->setAnimFrame(_globals._animationIndexes[1], 109);
+			_anim1ActvFl = true;
+			_game._player._visible = false;
+			_game._player._stepEnabled = false;
+			_bothStatus = 3;
+
+			_vm->_gameConv->run(20);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		} else if (_partedFl && (_globals[kFightStatus] == 0)) {
+			_scene->_hotspots.activate(NOUN_LID, false);
+			_scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44));
+			_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+
+			_anim2ActvFl = true;
+			_bothStatus = 3;
+			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('b', 1), 0);
+			int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(91, 108), FACING_NORTHWEST);
+			_scene->setAnimFrame(_globals._animationIndexes[2], 89);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 3);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 4);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 5);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 6);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 7);
+		} else if (_globals[kFightStatus]) {
+			_scene->_hotspots.activate(NOUN_LID, false);
+			_scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44));
+			_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+		} else {
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65);
+			_anim1ActvFl = true;
+			_bothStatus = 0;
+			_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+		}
+	}
+
+	if ((_scene->_priorSceneId == 504) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(5, 87);
+		_game._player._facing = FACING_EAST;
+		_game._player._stepEnabled = false;
+		_game._player.walk(Common::Point(58, 104), FACING_SOUTHEAST);
+		if (_globals[kCoffinStatus] != 2) {
+			_game._player.setWalkTrigger(70);
+			_anim1ActvFl = true;
+			_bothStatus = 0;
+			_scene->_hotspots.activate(NOUN_CHRISTINE, true);
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65);
+		} else {
+			_scene->_hotspots.activate(NOUN_LID, false);
+			_scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44));
+			_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+			_game._player._stepEnabled = true;
+		}
+	}
+
+	sceneEntrySound();
+}
+
+void Scene505::step() {
+	if (_anim0ActvFl)
+		handleRaoulAnimation();
+
+	if (_anim1ActvFl)
+		handleBothanimation();
+
+	if (_anim2ActvFl)
+		handlePartedAnimation();
+
+	if (_game._trigger == 65) {
+		_scene->freeAnimation(_globals._animationIndexes[1]);
+		_vm->_sound->command(1);
+		_partedFl = true;
+		_anim2ActvFl = true;
+		_anim1ActvFl = false;
+		_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('b', 1), 0);
+
+		int hotspotIDx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+		_scene->_dynamicHotspots.setPosition(hotspotIDx, Common::Point(91, 108), FACING_NORTHWEST);
+		_scene->_dynamicHotspots[hotspotIDx]._articleNumber = PREP_ON;
+		_scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 3);
+		_scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 4);
+		_scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 5);
+		_scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 6);
+		_scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 7);
+	}
+
+	if (_game._trigger == 70) {
+		_game._player._stepEnabled = true;
+		if (!_game._visitedScenes._sceneRevisited) {
+			_vm->_gameConv->run(20);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		}
+	}
+}
+
+void Scene505::actions() {
+	if (_game._trigger == 80) {
+		_bothStatus = 2;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 20) {
+		handleCoffinDialog();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) {
+		if (_globals[kCoffinStatus] != 2)
+			_vm->_dialogs->show(50536);
+		else {
+			_vm->_gameConv->run(20);
+			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+			_partStatus = 10;
+			_partCount = 0;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_UNLOCK, NOUN_LID)) && !_globals[kLookedAtSkullFace]) {
+		_vm->_dialogs->show(50539);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_UNLOCK, NOUN_SKULL_FACE) || _action.isAction(VERB_PUT, NOUN_KEY, NOUN_SKULL_FACE)) || ((_action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_UNLOCK, NOUN_LID)) && _globals[kLookedAtSkullFace])) {
+		if (_globals[kCoffinStatus] == 0) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 9, 95);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 96);
+				_action._inProgress = false;
+				return;
+
+			case 95:
+				_vm->_sound->command(76);
+				_vm->_dialogs->show(50528);
+				_action._inProgress = false;
+				return;
+
+			case 96:
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				_globals[kCoffinStatus] = 1;
+				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_action._inProgress = false;
+				return;
+
+			default:
+				break;
+			}
+		} else {
+			_vm->_dialogs->show(50534);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_PUSH, NOUN_SKULL) && (_scene->_customDest.x >= 19)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], false, 5, 2);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 6, 1);
+			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+			break;
+
+		case 1: {
+			int sprIdx;
+			_vm->_sound->command(77);
+			if (_scene->_customDest.x <= 44)
+				sprIdx = _globals._spriteIndexes[4];
+			else if (_scene->_customDest.x <= 58)
+				sprIdx = _globals._spriteIndexes[3];
+			else if (_scene->_customDest.x <= 71)
+				sprIdx = _globals._spriteIndexes[2];
+			else if (_scene->_customDest.x <= 84) {
+				sprIdx = _globals._spriteIndexes[1];
+				if (_globals[kCoffinStatus] == 1) {
+					_bothStatus = 1;
+					_scene->_hotspots.activate(NOUN_LID, false);
+					_scene->_hotspots.activate(NOUN_CHRISTINE, false);
+					_scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44));
+					_scene->changeVariant(1);
+				}
+			} else if (_scene->_customDest.x <= 100)
+				sprIdx = _globals._spriteIndexes[5];
+			else
+				sprIdx = _globals._spriteIndexes[6];
+
+			int skullSeqIdx = _scene->_sequences.startPingPongCycle(sprIdx, false, 5, 2);
+			_scene->_sequences.setAnimRange(skullSeqIdx, -1, -2);
+			_scene->_sequences.setDepth(skullSeqIdx, 1);
+				}
+				break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_game._player._visible = true;
+			_game._player._stepEnabled = true;
+			if (_bothStatus == 1) {
+				_game._player.walk(Common::Point(136, 126), FACING_EAST);
+				_game._player.setWalkTrigger(80);
+				_game._player._stepEnabled = false;
+			}
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) {
+		if (_anim2ActvFl) {
+			_leaveRoomFl = true;
+			_game._player._stepEnabled = false;
+		} else {
+			_globals[kChrisLeft505] = true;
+			_scene->_nextSceneId = 504;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(50510);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(50511);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(50512);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SARCOPHAGUS)) {
+			_vm->_dialogs->show((_globals[kCoffinStatus] <= 1) ? 50513 : 50514);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SKULL_FACE)) {
+			_globals[kLookedAtSkullFace] = true;
+			_vm->_dialogs->show(50529);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR)) {
+			_vm->_dialogs->show(50519);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SKULL)) {
+			_vm->_dialogs->show((_scene->_customDest.x < 19) ? 50521 : 50520);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SKULLS)) {
+			_vm->_dialogs->show(50521);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TOTEM)) {
+			_vm->_dialogs->show(50522);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DESK)) {
+			_vm->_dialogs->show(50523);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_POLE)) {
+			_vm->_dialogs->show(50524);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CURTAIN)) {
+			_vm->_dialogs->show(50525);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHRISTINE)) {
+			_vm->_dialogs->show((_globals[kCoffinStatus] == 2) ? 50530 : 50537);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_LID)) {
+			_vm->_dialogs->show((_globals[kCoffinStatus] == 2) ? 50531 : 50532);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_LOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_LOCK, NOUN_LID) || _action.isAction(VERB_LOCK, NOUN_SKULL_FACE)) {
+		_vm->_dialogs->show(50535);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_OPEN, NOUN_SARCOPHAGUS) || _action.isAction(VERB_OPEN, NOUN_LID)) {
+		if (_globals[kCoffinStatus] == 2)
+			_vm->_dialogs->show(50533);
+		else if (_globals[kCoffinStatus] == 1)
+			_vm->_dialogs->show(50518);
+		else
+			_vm->_dialogs->show(50515);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE) && (_globals[kCoffinStatus] != 2)) {
+		_vm->_dialogs->show(50538);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) {
+		_vm->_dialogs->show((_globals[kCoffinStatus] <= 1) ? 50538 : 50540);
+		_action._inProgress = false;
+	}
+}
+
+void Scene505::preActions() {
+	if ((_globals[kCoffinStatus] == 0) && (_action.isAction(VERB_UNLOCK, NOUN_SKULL_FACE) || _action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_PUT, NOUN_KEY, NOUN_SKULL_FACE) || _action.isAction(VERB_UNLOCK, NOUN_LID))) {
+		if (_action.isObject(NOUN_SKULL_FACE) || _globals[kLookedAtSkullFace])
+			_game._player.walk(Common::Point(279, 150), FACING_SOUTHWEST);
+	}
+
+	if (_action.isObject(NOUN_SKULL_FACE) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)))
+		_game._player.walk(Common::Point(279, 150), FACING_SOUTHWEST);
+
+	if (_action.isObject(NOUN_CURTAIN) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)))
+		_game._player._needToWalk = true;
+
+	if (_action.isObject(NOUN_SKULL) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)))
+		_game._player._needToWalk = true;
+}
+
+void Scene505::handleCoffinDialog() {
+	int interlocutorFl = false;
+	int heroFl = false;
+
+	switch (_action._activeAction._verbId) {
+	case 8:
+		heroFl = true;
+		interlocutorFl = true;
+		_bothStatus = 6;
+		break;
+
+	case 14:
+		heroFl = true;
+		interlocutorFl = true;
+		if (!_checkFrame106)
+			_vm->_gameConv->hold();
+		break;
+
+	case 17:
+		heroFl = true;
+		interlocutorFl = true;
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_raoulStatus = 2;
+		}
+		break;
+
+	case 20:
+		heroFl = true;
+		interlocutorFl = true;
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_game._player.walk(Common::Point(244, 130), FACING_SOUTHWEST);
+			_game._player.setWalkTrigger(71);
+		}
+		break;
+
+	case 22:
+		heroFl = true;
+		interlocutorFl = true;
+		if (!_game._trigger) {
+			_vm->_gameConv->hold();
+			_bothStatus = 7;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	switch (_game._trigger) {
+	case 70:
+	case 76:
+		_vm->_gameConv->release();
+		break;
+
+	case 71:
+		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 75);
+		_anim0ActvFl = true;
+		_raoulStatus = 0;
+		_raoulCount = 0;
+		_game._player._visible = false;
+		break;
+
+	case 75:
+		_game._player._visible = true;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_scene->_sequences.setTimingTrigger(10, 76);
+		break;
+
+	case 85:
+		if ((_bothStatus != 6) && (_bothStatus != 0))
+			_bothStatus = 5;
+		break;
+
+	case 90:
+		if ((_bothStatus != 6) && (_bothStatus != 0))
+			_bothStatus = 4;
+		break;
+
+	default:
+		break;
+	}
+
+	if (!heroFl)
+		_vm->_gameConv->setHeroTrigger(85);
+
+	if (!interlocutorFl)
+		_vm->_gameConv->setInterlocutorTrigger(90);
+
+	_bothCount = 0;
+}
+
+void Scene505::handleRaoulAnimation() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+	if (curFrame == _raoulFrame)
+		return;
+
+	_raoulFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_raoulFrame) {
+	case 3:
+		_vm->_gameConv->release();
+		break;
+
+	case 4:
+	case 5:
+	case 6:
+		if (_raoulStatus == 0) {
+			resetFrame = _vm->getRandomNumber(3, 5);
+			++_raoulCount;
+			if (_raoulCount > 20) {
+				_raoulStatus = 1;
+				resetFrame = 3;
+			}
+			break;
+		}
+
+		if (_raoulStatus == 1)
+			resetFrame = 3;
+
+		if (_raoulStatus == 2)
+			resetFrame = 6;
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_raoulFrame = resetFrame;
+	}
+}
+
+void Scene505::handleBothanimation() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
+	if (curFrame == _bothFrame)
+		return;
+
+	_bothFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_bothFrame) {
+	case 1:
+	case 20:
+	case 39:
+		if (_bothStatus == 0) {
+			if (_vm->getRandomNumber(1, 35) == 1) {
+				if (_vm->getRandomNumber(1, 2) == 1)
+					resetFrame = 1;
+				else
+					resetFrame = 20;
+			} else
+				resetFrame = 0;
+		} else if (_bothStatus == 1)
+			resetFrame = 39;
+		else
+			resetFrame = 0;
+		break;
+
+	case 14:
+		if (_vm->getRandomNumber(1, 3) == 1)
+			resetFrame = 8;
+		break;
+
+	case 32:
+		if (_vm->getRandomNumber(1, 2) == 1)
+			resetFrame = 28;
+		break;
+
+	case 41:
+		_vm->_sound->command(39);
+		break;
+
+	case 51:
+		_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+		_globals[kCoffinStatus] = 2;
+		break;
+
+	case 66:
+		_game._player._stepEnabled = false;
+		_vm->_gameConv->run(20);
+		_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
+		break;
+
+	case 67:
+		if (_bothStatus == 1)
+			resetFrame = 66;
+		break;
+
+	case 68:
+		_game._player._visible = false;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		break;
+
+	case 106:
+		_checkFrame106 = true;
+		_vm->_gameConv->release();
+		break;
+
+	case 109:
+	case 130:
+		_vm->_gameConv->release();
+		break;
+
+	case 110:
+	case 111:
+	case 112:
+	case 113:
+	case 114:
+	case 115:
+	case 131:
+		switch (_bothStatus) {
+		case 4:
+			resetFrame = _vm->getRandomNumber(112, 114);
+			++_bothCount;
+			if (_bothCount > 20) {
+				_bothStatus = 3;
+				resetFrame = 109;
+			}
+			break;
+
+		case 5:
+			resetFrame = _vm->getRandomNumber(109, 111);
+			++_bothCount;
+			if (_bothCount > 20) {
+				_bothStatus = 3;
+				resetFrame = 109;
+			}
+			break;
+
+		case 6:
+			resetFrame = 131;
+			_bothStatus = 8;
+			_game._player._stepEnabled = false;
+			break;
+
+		case 7:
+			resetFrame = 115;
+			_bothStatus = 3;
+			break;
+
+		default:
+			resetFrame = 109;
+			break;
+		}
+		break;
+
+	case 127:
+		_vm->_sound->command(26);
+		_game._objects.addToInventory(OBJ_WEDDING_RING);
+		_vm->_dialogs->showItem(OBJ_WEDDING_RING, 821, 0);
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
+		_bothFrame = resetFrame;
+	}
+}
+
+void Scene505::handlePartedAnimation() {
+	int curFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
+	if (curFrame == _partFrame)
+		return;
+
+	_partFrame = curFrame;
+	int resetFrame = -1;
+
+	switch (_partFrame) {
+	case 20:
+		_vm->_sound->command(16);
+		break;
+
+	case 25:
+		_game._player._playerPos = Common::Point(93, 133);
+		_game._player.resetFacing(FACING_WEST);
+		_game._player._visible = true;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[2]);
+		break;
+
+	case 70:
+		_game._player._stepEnabled = true;
+		break;
+
+	case 90:
+		if (_partStatus == 10)
+			resetFrame = 146;
+		else if (!_leaveRoomFl)
+			resetFrame = 89;
+		break;
+
+	case 145:
+		_scene->_nextSceneId = 504;
+		break;
+
+	case 147:
+	case 148:
+	case 149:
+		resetFrame = _vm->getRandomNumber(146, 148);
+		++_partCount;
+		if (_partCount > 10) {
+			resetFrame = 89;
+			_partStatus = 8;
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
+		_partFrame = resetFrame;
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h
index 044e604..b2f6340 100644
--- a/engines/mads/phantom/phantom_scenes5.h
+++ b/engines/mads/phantom/phantom_scenes5.h
@@ -161,6 +161,41 @@ public:
 	virtual void actions();
 };
 
+class Scene505 : public Scene5xx {
+private:
+  bool _anim0ActvFl;
+  bool _anim1ActvFl;
+  bool _anim2ActvFl;
+  bool _checkFrame106;
+  bool _leaveRoomFl;
+  bool _partedFl;
+
+  int _raoulStatus;
+  int _raoulFrame;
+  int _raoulCount;
+  int _bothStatus;
+  int _bothFrame;
+  int _bothCount;
+  int _partStatus;
+  int _partFrame;
+  int _partCount;
+
+  void handleRaoulAnimation();
+  void handleBothanimation();
+  void handlePartedAnimation();
+  void handleCoffinDialog();
+
+public:
+	Scene505(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 98d1363041b129b30a6bbf23947f917d0f640be7
    https://github.com/scummvm/scummvm/commit/98d1363041b129b30a6bbf23947f917d0f640be7
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-08T22:47:20+01:00

Commit Message:
MADS: Phantom: Add scene 506

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/phantom/phantom_scenes5.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 293ed3a..9fd7c6c 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -151,7 +151,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 505:	// Phantom's hideout, sarcophagus
 		return new Scene505(vm);
 	case 506:	// catacomb room with ramp
-		return new DummyScene(vm);	// TODO
+		return new Scene506(vm);
 
 	default:
 		error("Invalid scene %d called", scene._nextSceneId);
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 6c3d037..6a3644f 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -3906,5 +3906,404 @@ void Scene505::handlePartedAnimation() {
 
 /*------------------------------------------------------------------------*/
 
+Scene506::Scene506(MADSEngine *vm) : Scene5xx(vm) {
+	_anim0ActvFl = false;
+	_skipFl = false;
+	_ascendingFl = false;
+}
+
+void Scene506::synchronize(Common::Serializer &s) {
+	Scene5xx::synchronize(s);
+
+	s.syncAsByte(_anim0ActvFl);
+	s.syncAsByte(_skipFl);
+	s.syncAsByte(_ascendingFl);
+}
+
+void Scene506::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_CHRISTINE);
+	_scene->addActiveVocab(VERB_LOOK_AT);
+
+	if (!_globals[kChristineIsInBoat])
+		_scene->_initialVariant = 1;
+}
+
+void Scene506::enter() {
+	_vm->_disableFastwalk = true;
+
+	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_anim0ActvFl = false;
+		_skipFl = false;
+		_ascendingFl = false;
+	}
+
+	_vm->_gameConv->get(26);
+
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
+
+	if (_game._objects.isInRoom(OBJ_OAR)) {
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+	} else
+		_scene->_hotspots.activate(NOUN_OAR, false);
+
+	_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+	_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+	_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0);
+	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+	_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+
+	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+		if (!_globals[kChristineIsInBoat]) {
+			_anim0ActvFl = true;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0);
+			_scene->setAnimFrame(_globals._animationIndexes[0], 239);
+			int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6);
+		}
+	} else if (_scene->_priorSceneId == 504) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+		if (_game._visitedScenes._sceneRevisited) {
+			_game._player._playerPos = Common::Point(189, 123);
+			_game._player._facing = FACING_SOUTHWEST;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+
+			if (!_globals[kChristineIsInBoat]) {
+				_anim0ActvFl = true;
+				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0);
+				_scene->setAnimFrame(_globals._animationIndexes[0], 239);
+				int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+				_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+				_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST);
+				_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6);
+			}
+			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 2), 95);
+		} else {
+			_game._player._playerPos = Common::Point(186, 122);
+			_game._player._facing = FACING_SOUTHWEST;
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_anim0ActvFl = true;
+			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0);
+			int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
+			_scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON;
+			_scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 2);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 3);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 4);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 5);
+			_scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6);
+		}
+	} else if ((_scene->_priorSceneId == 501) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
+		_game._player._playerPos = Common::Point(0, 142);
+		_game._player._facing = FACING_EAST;
+		_game._player._stepEnabled = false;
+		_game._player.walk(Common::Point(23, 145), FACING_EAST);
+		_game._player.setWalkTrigger(60);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene506::step() {
+	switch (_game._trigger) {
+	case 60:
+		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 61);
+		break;
+
+	case 61:
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+		_game._player._stepEnabled = true;
+		break;
+
+	case 95:
+		_game._player._visible = true;
+		_game._player._stepEnabled = true;
+		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		break;
+
+	default:
+		break;
+	}
+
+	if (_anim0ActvFl) {
+		int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+		if ((curFrame == 141) && !_skipFl) {
+			_game._player._visible = true;
+			_skipFl = true;
+			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		}
+
+		if (curFrame == 240)
+			_scene->setAnimFrame(_globals._animationIndexes[0], 239);
+
+		if (curFrame == 300)
+			_scene->setAnimFrame(_globals._animationIndexes[0], 239);
+
+		if (curFrame == 168)
+			_game._player._stepEnabled = true;
+
+		if (curFrame == 289)
+			_scene->_nextSceneId = 501;
+	}
+
+	if (_ascendingFl && (_vm->_gameConv->_running != 26)) {
+		_ascendingFl = false;
+		_game._player._stepEnabled = false;
+	}
+}
+
+void Scene506::actions() {
+	if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) {
+		_vm->_gameConv->run(26);
+		_vm->_gameConv->exportValue(1);
+		_scene->setAnimFrame(_globals._animationIndexes[0], 290);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_OAR)) {
+		switch (_game._trigger) {
+		case (0):
+			if (_game._objects.isInRoom(OBJ_OAR)) {
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 1);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 2);
+			}
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[5]);
+			_scene->_hotspots.activate(NOUN_OAR, false);
+			_game._objects.addToInventory(OBJ_OAR);
+			_vm->_sound->command(26);
+			break;
+
+		case 2:
+			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[4]);
+			_game._player._visible = true;
+			_scene->_sequences.setTimingTrigger(20, 3);
+			break;
+
+		case 3:
+			_vm->_dialogs->showItem(OBJ_OAR, 824, 0);
+			_game._player._stepEnabled = true;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		if (_scene->_customDest.x < 150) {
+			switch (_game._trigger) {
+			case (0):
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 65);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 67);
+				break;
+
+			case 65:
+				_scene->deleteSequence(_globals._sequenceIndexes[3]);
+				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
+				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 66);
+				_vm->_sound->command(24);
+				break;
+
+			case 66:
+				_game._player.walk(Common::Point(0, 142), FACING_WEST);
+				_game._player.setWalkTrigger(68);
+				break;
+
+			case 67:
+				_game._player._visible = true;
+				break;
+
+			case 68:
+				if (_globals[kChristineIsInBoat])
+					_scene->_nextSceneId = 501;
+				else
+					_scene->setAnimFrame(_globals._animationIndexes[0], 241);
+				break;
+
+			default:
+				break;
+			}
+		} else {
+			switch (_game._trigger) {
+			case (0):
+				if (!_globals[kChristineIsInBoat]) {
+					_vm->_gameConv->run(26);
+					_vm->_gameConv->exportValue(2);
+					int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+					if (curFrame == 240 || curFrame == 239)
+						_scene->setAnimFrame(_globals._animationIndexes[0], 290);
+					_ascendingFl = true;
+				}
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 5, 1);
+				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
+				_game.syncTimers(1, _globals._sequenceIndexes[7], 2, 0);
+				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 90);
+				break;
+
+			case 90:
+				_vm->_gameConv->abortConv();
+				_scene->_nextSceneId = 504;
+				break;
+
+			default:
+				break;
+			}
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 26) {
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(50610);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(50611);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(50612);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TORCH)) {
+			_vm->_dialogs->show(50613);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_COLUMN)) {
+			_vm->_dialogs->show(50614);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(50615);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_RAMP)) {
+			_vm->_dialogs->show(50616);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR)) {
+			if (_scene->_customDest.x < 150)
+				_vm->_dialogs->show(50617);
+			else
+				_vm->_dialogs->show(50618);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_OAR) && _game._objects.isInRoom(OBJ_OAR)) {
+			_vm->_dialogs->show(50619);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHRISTINE)) {
+			if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() < 235)
+				_vm->_dialogs->show(50621);
+			else
+				_vm->_dialogs->show(50620);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_TORCH)) {
+		_vm->_dialogs->show(50613);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) {
+		_vm->_dialogs->show(50622);
+		_action._inProgress = false;
+	}
+}
+
+void Scene506::preActions() {
+	if (_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR))
+		_game._player.walk(Common::Point(33, 142), FACING_NORTHWEST);
+
+	if (_action.isAction(VERB_OPEN, NOUN_DOOR)) {
+		if (_scene->_customDest.x < 150)
+			_game._player.walk(Common::Point(33, 142), FACING_NORTHWEST);
+		else
+			_game._player.walk(Common::Point(191, 118), FACING_EAST);
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Phantom
 } // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h
index b2f6340..903819a 100644
--- a/engines/mads/phantom/phantom_scenes5.h
+++ b/engines/mads/phantom/phantom_scenes5.h
@@ -116,39 +116,39 @@ public:
 
 class Scene504 : public Scene5xx {
 private:
-  bool _anim0ActvFl;
-  bool _anim1ActvFl;
-  bool _anim2ActvFl;
-  bool _anim3ActvFl;
-  bool _anim4ActvFl;
-  bool _anim5ActvFl;
-  bool _playingMusicFl;
-  bool _chairDialogDoneFl;
-  bool _fireBreathFl;
-
-  int _songNum;
-  int _input3Count;
-  int _playCount;
-  int _listenStatus;
-  int _listenFrame;
-  int _chairStatus;
-  int _chairFrame;
-  int _playStatus;
-  int _playFrame;
-  int _phantomStatus;
-  int _phantomFrame;
-  int _christineTalkCount;
-  int _deathCounter;
-
-  void handleListenAnimation();
-  void handleOrganAnimation();
-  void handleChairAnimation();
-  void handlePhantomAnimation1();
-  void handlePhantomAnimation2();
-  void handlePhantomAnimation3();
-  void handleListenConversation();
-  void handlePlayConversation();
-  void handleFightConversation();
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _anim3ActvFl;
+	bool _anim4ActvFl;
+	bool _anim5ActvFl;
+	bool _playingMusicFl;
+	bool _chairDialogDoneFl;
+	bool _fireBreathFl;
+
+	int _songNum;
+	int _input3Count;
+	int _playCount;
+	int _listenStatus;
+	int _listenFrame;
+	int _chairStatus;
+	int _chairFrame;
+	int _playStatus;
+	int _playFrame;
+	int _phantomStatus;
+	int _phantomFrame;
+	int _christineTalkCount;
+	int _deathCounter;
+
+	void handleListenAnimation();
+	void handleOrganAnimation();
+	void handleChairAnimation();
+	void handlePhantomAnimation1();
+	void handlePhantomAnimation2();
+	void handlePhantomAnimation3();
+	void handleListenConversation();
+	void handlePlayConversation();
+	void handleFightConversation();
 
 public:
 	Scene504(MADSEngine *vm);
@@ -163,27 +163,27 @@ public:
 
 class Scene505 : public Scene5xx {
 private:
-  bool _anim0ActvFl;
-  bool _anim1ActvFl;
-  bool _anim2ActvFl;
-  bool _checkFrame106;
-  bool _leaveRoomFl;
-  bool _partedFl;
-
-  int _raoulStatus;
-  int _raoulFrame;
-  int _raoulCount;
-  int _bothStatus;
-  int _bothFrame;
-  int _bothCount;
-  int _partStatus;
-  int _partFrame;
-  int _partCount;
-
-  void handleRaoulAnimation();
-  void handleBothanimation();
-  void handlePartedAnimation();
-  void handleCoffinDialog();
+	bool _anim0ActvFl;
+	bool _anim1ActvFl;
+	bool _anim2ActvFl;
+	bool _checkFrame106;
+	bool _leaveRoomFl;
+	bool _partedFl;
+
+	int _raoulStatus;
+	int _raoulFrame;
+	int _raoulCount;
+	int _bothStatus;
+	int _bothFrame;
+	int _bothCount;
+	int _partStatus;
+	int _partFrame;
+	int _partCount;
+
+	void handleRaoulAnimation();
+	void handleBothanimation();
+	void handlePartedAnimation();
+	void handleCoffinDialog();
 
 public:
 	Scene505(MADSEngine *vm);
@@ -196,6 +196,23 @@ public:
 	virtual void actions();
 };
 
+class Scene506 : public Scene5xx {
+private:
+	bool _anim0ActvFl;
+	bool _skipFl;
+	bool _ascendingFl;
+
+public:
+	Scene506(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Phantom
 } // End of namespace MADS
 


Commit: 7bd86b84a9acab80881cb3595fea093f704a39a0
    https://github.com/scummvm/scummvm/commit/7bd86b84a9acab80881cb3595fea093f704a39a0
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T09:05:54+01:00

Commit Message:
MADS: Phantom: Remove an erroneous TODO

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 9fd7c6c..660eb40 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -41,9 +41,6 @@ namespace Phantom {
 SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	Scene &scene = vm->_game->_scene;
 
-	// TODO
-	//scene.addActiveVocab(NOUN_DROP);
-
 	switch (scene._nextSceneId) {
 	// Scene group #1 (theater, stage and dressing rooms)
 	case 101:	// seats


Commit: 8a74ec9da99a07f140a5863681d83332e9df0153
    https://github.com/scummvm/scummvm/commit/8a74ec9da99a07f140a5863681d83332e9df0153
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T09:08:29+01:00

Commit Message:
MADS: Phantom: Fix coding style in Scene1xx

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 6b05fee..be05e37 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -112,7 +112,8 @@ void Scene1xx::setPlayerSpritesPrefix() {
 	if (oldName != _game._player._spritesPrefix)
 		_game._player._spritesChanged = true;
 
-	_game._player._scalingVelocity = true;}
+	_game._player._scalingVelocity = true;
+}
 
 /*------------------------------------------------------------------------*/
 


Commit: 47f43770ae05477d2ea41858d48248391006ce59
    https://github.com/scummvm/scummvm/commit/47f43770ae05477d2ea41858d48248391006ce59
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T09:22:27+01:00

Commit Message:
MADS: Phantom: Only force a reset of scaling velocity when the section changes

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/phantom/phantom_scenes2.h
    engines/mads/phantom/phantom_scenes3.h
    engines/mads/phantom/phantom_scenes4.h
    engines/mads/phantom/phantom_scenes5.h



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 660eb40..344601f 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -41,6 +41,9 @@ namespace Phantom {
 SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	Scene &scene = vm->_game->_scene;
 
+	if ((scene._nextSceneId / 100) != (scene._priorSceneId / 100))
+		vm->_game->_player._scalingVelocity = true;
+
 	switch (scene._nextSceneId) {
 	// Scene group #1 (theater, stage and dressing rooms)
 	case 101:	// seats
diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h
index dbf7d6d..d1be6e0 100644
--- a/engines/mads/phantom/phantom_scenes1.h
+++ b/engines/mads/phantom/phantom_scenes1.h
@@ -50,7 +50,7 @@ protected:
 	 */
 	void setPlayerSpritesPrefix();
 public:
-	Scene1xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
+	Scene1xx(MADSEngine *vm) : PhantomScene(vm) {}
 };
 
 class Scene101 : public Scene1xx {
diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h
index 14a2848..7e86e2c 100644
--- a/engines/mads/phantom/phantom_scenes2.h
+++ b/engines/mads/phantom/phantom_scenes2.h
@@ -50,7 +50,7 @@ protected:
 	 */
 	void setPlayerSpritesPrefix();
 public:
-	Scene2xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
+	Scene2xx(MADSEngine *vm) : PhantomScene(vm) {}
 };
 
 class Scene201 : public Scene2xx {
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index bea0203..48ca998 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -50,7 +50,7 @@ protected:
 	 */
 	void setPlayerSpritesPrefix();
 public:
-	Scene3xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
+	Scene3xx(MADSEngine *vm) : PhantomScene(vm) {}
 };
 
 class Scene301 : public Scene3xx {
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index ed35d77..eb3c1bd 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -50,7 +50,7 @@ protected:
 	 */
 	void setPlayerSpritesPrefix();
 public:
-	Scene4xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
+	Scene4xx(MADSEngine *vm) : PhantomScene(vm) {}
 };
 
 class Scene401 : public Scene4xx {
diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h
index 903819a..dc8a870 100644
--- a/engines/mads/phantom/phantom_scenes5.h
+++ b/engines/mads/phantom/phantom_scenes5.h
@@ -50,7 +50,7 @@ protected:
 	 */
 	void setPlayerSpritesPrefix();
 public:
-	Scene5xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
+	Scene5xx(MADSEngine *vm) : PhantomScene(vm) {}
 };
 
 class Scene501 : public Scene5xx {


Commit: bff5a3e6802e9a7f00e7089a3d9c3516a82f27e7
    https://github.com/scummvm/scummvm/commit/bff5a3e6802e9a7f00e7089a3d9c3516a82f27e7
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-11-09T12:04:09+02:00

Commit Message:
MADS: Phantom: Implement Scene::drawToBackground()

This is used to conditionally display additional background objects.
Also, added a TODO in Scene::deleteSequence()

Changed paths:
    engines/mads/scene.cpp



diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 4c48619..4e7ec2f 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -793,8 +793,23 @@ void Scene::setCamera(Common::Point pos) {
 	_posAdjust = pos;
 }
 
-void Scene::drawToBackground(int series_id, int sprite_id, Common::Point pos, int depth, int scale) {
-	warning("TODO: Scene::drawToBackground");
+void Scene::drawToBackground(int spriteId, int frameId, Common::Point pos, int depth, int scale) {
+	SpriteAsset &asset = *_sprites[spriteId];
+
+	if (pos.x == -32000)
+		pos.x = asset.getFramePos(frameId - 1).x;
+	if (pos.y == -32000)
+		pos.y = asset.getFramePos(frameId - 1).y;
+
+	int slotIndex = _spriteSlots.add();
+	SpriteSlot &slot = _spriteSlots[slotIndex];
+	slot._spritesIndex = spriteId;
+	slot._frameNumber = frameId;
+	slot._seqIndex = 1;
+	slot._position = pos;
+	slot._depth = depth;
+	slot._scale = scale;
+	slot._flags = IMG_DELTA;
 }
 
 void Scene::deleteSequence(int idx) {
@@ -803,10 +818,13 @@ void Scene::deleteSequence(int idx) {
 
 	_sequences[idx]._active = false;
 
-	if (!_sequences[idx]._doneFlag)
-		doFrame();	// FIXME/CHECKME: Is this correct?
-	else
+	if (!_sequences[idx]._doneFlag) {
+		warning("TODO: deleteSequence: Sequence %d not done", idx);
+		// TODO: This is wrong, and crashes Phantom at scene 102 when the door is opened
+		//doFrame();	// FIXME/CHECKME: Is this correct?
+	} else {
 		_sequences.remove(idx);
+	}
 }
 
 void Scene::loadSpeech(int idx) {


Commit: d09d68ef7040b360a80dea997b901441aee8cbfc
    https://github.com/scummvm/scummvm/commit/d09d68ef7040b360a80dea997b901441aee8cbfc
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-11-09T12:05:01+02:00

Commit Message:
MADS: Phantom: Fix bug in Scene102::enter()

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index be05e37..a1b3fbd 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -624,7 +624,7 @@ void Scene102::enter() {
 
 	if (_globals[kCurrentYear] == 1993) {
 		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
-		_scene->drawToBackground(_globals._sequenceIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
+		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 	} else {
 		_scene->_hotspots.activate(NOUN_CHANDELIER, false);


Commit: ff4d0b9f544d1267db623825112ff17ca4b29076
    https://github.com/scummvm/scummvm/commit/ff4d0b9f544d1267db623825112ff17ca4b29076
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-11-09T12:09:30+02:00

Commit Message:
MADS: Phantom: Update the definition of drawToBackground()

Changed paths:
    engines/mads/scene.h



diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index 2246516..147dff8 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -259,7 +259,7 @@ public:
 
 	void setDynamicAnim(int id, int anim_id, int segment);
 	void setCamera(Common::Point pos);
-	void drawToBackground(int series_id, int sprite_id, Common::Point pos, int depth, int scale);
+	void drawToBackground(int spriteId, int frameId, Common::Point pos, int depth, int scale);
 	void deleteSequence(int idx);
 	void loadSpeech(int idx);
 	void playSpeech(int idx);


Commit: 9abf901c28b71bbac0dcddd8a754da93f0199b11
    https://github.com/scummvm/scummvm/commit/9abf901c28b71bbac0dcddd8a754da93f0199b11
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T18:05:02+01:00

Commit Message:
MADS: Phantom: Implement doObjectAction()

Changed paths:
    engines/mads/dialogs.h
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h
    engines/mads/phantom/phantom_scenes.h



diff --git a/engines/mads/dialogs.h b/engines/mads/dialogs.h
index efd2871..27bc0a4 100644
--- a/engines/mads/dialogs.h
+++ b/engines/mads/dialogs.h
@@ -226,6 +226,11 @@ public:
 	virtual void showItem(int objectId, int messageId, int speech = 0) = 0;
 	virtual Common::String getVocab(int vocabId) = 0;
 	virtual bool show(int messageId, int objectId = -1) = 0;
+
+	/**
+	* Show a spinning picture of an object, used in V2+ games
+	*/
+	virtual void spinObject(int idx) { warning("TODO: spinObject"); }
 };
 
 class FullScreenDialog: public EventTarget {
diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index a995cd0..cd01c58 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -259,14 +259,295 @@ void GamePhantom::checkShowDialog() {
 	}
 }
 
+void GamePhantom::global_object_examine() {
+	MADSAction &action = _scene._action;
+	int	id = _objects.getIdFromDesc(action._activeAction._objectNameId);
+
+	if (action.isAction(VERB_LOOK, NOUN_RED_FRAME))
+		_vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 802 : 842, 0);
+	else if (action.isAction(VERB_LOOK, NOUN_YELLOW_FRAME))
+		_vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 804 : 843, 0);
+	else if (action.isAction(VERB_LOOK, NOUN_BLUE_FRAME))
+		_vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 817 : 844, 0);
+	else if (action.isAction(VERB_LOOK, NOUN_GREEN_FRAME))
+		_vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 819 : 845, 0);
+	else if (action.isAction(VERB_LOOK, NOUN_LANTERN))
+		_vm->_dialogs->showItem(id, (_globals[kLanternStatus] == 1) ? 831 : 801, 0);
+	else if (action.isAction(VERB_LOOK, NOUN_SMALL_NOTE))
+		_vm->_dialogs->showItem(OBJ_SMALL_NOTE, 846, 2);
+	else if (action.isAction(VERB_LOOK, NOUN_PARCHMENT))
+		_vm->_dialogs->showItem(OBJ_PARCHMENT, 812, 3);
+	else if (action.isAction(VERB_LOOK, NOUN_LETTER))
+		_vm->_dialogs->showItem(OBJ_LETTER, 813, 4);
+	else if (action.isAction(VERB_LOOK, NOUN_NOTICE))
+		_vm->_dialogs->showItem(OBJ_NOTICE, 814, 5);
+	else if (action.isAction(VERB_LOOK, NOUN_CRUMPLED_NOTE))
+		_vm->_dialogs->showItem(OBJ_CRUMPLED_NOTE, 816, 6);
+	else if (action.isAction(VERB_LOOK, NOUN_LARGE_NOTE))
+		_vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7);
+	else
+	_vm->_dialogs->showItem(id, 800 + id, 0);
+}
+
 void GamePhantom::doObjectAction() {
-	// TODO: Copied from Nebular
-	//Scene &scene = _scene;
 	MADSAction &action = _scene._action;
-	//Dialogs &dialogs = *_vm->_dialogs;
-	//int id;
 
-	action._inProgress = false;
+	if ((_scene._currentSceneId >= 401) && (_scene._currentSceneId <= 456)
+	 && (action.isObject(NOUN_RED_FRAME) || action.isObject(NOUN_YELLOW_FRAME) || action.isObject(NOUN_GREEN_FRAME) || action.isObject(NOUN_BLUE_FRAME))
+	 && action.isAction(VERB_PUT)) {
+		if (action.isTarget(NOUN_UNLUCKY_ADVENTURER)) {
+			_vm->_dialogs->show(35);
+			action._inProgress = false;
+			return;
+		} else if (action.isTarget(NOUN_HOLE)) {
+			_vm->_dialogs->show(36);
+			action._inProgress = false;
+			return;
+		} else if (action.isTarget(NOUN_GRATE)) {
+			_vm->_dialogs->show(37);
+			action._inProgress = false;
+			return;
+		} else if (action.isTarget(NOUN_WALL)) {
+			_vm->_dialogs->show(38);
+			action._inProgress = false;
+			return;
+		}
+	}
+
+	if (action._lookFlag) {
+		_vm->_dialogs->show(810);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_PUT, NOUN_RED_FRAME) || action.isAction(VERB_PUT, NOUN_BLUE_FRAME) || action.isAction(VERB_PUT, NOUN_YELLOW_FRAME) || action.isAction(VERB_PUT, NOUN_GREEN_FRAME)) {
+		_vm->_dialogs->show((action.isTarget(NOUN_PUDDLE)) ? 40124 : 40125);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_WEAR, NOUN_WEDDING_RING)) {
+		if (_globals[kRingIsOnFinger])
+			_vm->_dialogs->show(849);
+		else {
+			_vm->_dialogs->show(835);
+			_globals[kRingIsOnFinger] = true;
+		}
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_REMOVE, NOUN_WEDDING_RING)) {
+		if (!_globals[kRingIsOnFinger])
+			_vm->_dialogs->show(848);
+		else {
+			_vm->_dialogs->show(836);
+			_globals[kRingIsOnFinger] = false;
+		}
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_WEST) || action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_EAST) || action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_NORTH)) {
+		_vm->_dialogs->show(34);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_ATTACK, NOUN_CHRISTINE)) {
+		_vm->_dialogs->show(33);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_KEY)) {
+		_vm->_dialogs->showItem(OBJ_KEY, 800, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_SANDBAG)) {
+		_vm->_dialogs->showItem(OBJ_SANDBAG, 803, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_SMALL_NOTE) || action.isAction(VERB_READ, NOUN_SMALL_NOTE)) {
+		_vm->_dialogs->showItem(OBJ_SMALL_NOTE, 806, 2);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_ROPE)) {
+		_vm->_dialogs->showItem(OBJ_ROPE, 807, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_SWORD)) {
+		_vm->_dialogs->showItem(OBJ_SWORD, 808, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_ENVELOPE) || action.isAction(VERB_READ, NOUN_ENVELOPE)) {
+		_vm->_dialogs->showItem(OBJ_ENVELOPE, 809, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_TICKET) || action.isAction(VERB_READ, NOUN_TICKET)) {
+		_vm->_dialogs->showItem(OBJ_TICKET, 810, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_PIECE_OF_PAPER) || action.isAction(VERB_READ, NOUN_PIECE_OF_PAPER)) {
+		_vm->_dialogs->showItem(OBJ_PIECE_OF_PAPER, 811, 1);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_PARCHMENT) || action.isAction(VERB_READ, NOUN_PARCHMENT)) {
+		_vm->_dialogs->showItem(OBJ_PARCHMENT, 812, 3);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_LETTER) || action.isAction(VERB_READ, NOUN_LETTER)) {
+		_vm->_dialogs->showItem(OBJ_LETTER, 813, 4);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_NOTICE) || action.isAction(VERB_READ, NOUN_NOTICE)) {
+		_vm->_dialogs->showItem(OBJ_NOTICE, 814, 5);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_BOOK) || action.isAction(VERB_READ, NOUN_BOOK)) {
+		_vm->_dialogs->showItem(OBJ_BOOK, 815, 0);
+		action._inProgress = false;
+		return;
+	} 
+
+	if (action.isAction(VERB_LOOK, NOUN_CRUMPLED_NOTE) || action.isAction(VERB_READ, NOUN_CRUMPLED_NOTE)) {
+		_vm->_dialogs->showItem(OBJ_CRUMPLED_NOTE, 816, 6);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_LARGE_NOTE) || action.isAction(VERB_READ, NOUN_LARGE_NOTE)) {
+		_vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_MUSIC_SCORE) || action.isAction(VERB_READ, NOUN_MUSIC_SCORE)) {
+		_vm->_dialogs->showItem(OBJ_MUSIC_SCORE, 820, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_WEDDING_RING)) {
+		_vm->_dialogs->showItem(OBJ_WEDDING_RING, 821, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_CABLE_HOOK)) {
+		_vm->_dialogs->showItem(OBJ_CABLE_HOOK, 822, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_ROPE_WITH_HOOK)) {
+		_vm->_dialogs->showItem(OBJ_ROPE_WITH_HOOK, 823, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK, NOUN_OAR)) {
+		_vm->_dialogs->showItem(OBJ_OAR, 824, 0);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_LOOK) && _objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) {
+		global_object_examine();
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_TURN_ON, NOUN_LANTERN)) {
+		if ((_globals[kLanternStatus] == 1) && !_trigger)
+			_vm->_dialogs->show(828);
+		else {
+			switch (_trigger) {
+			case 0:
+				_scene._sequences.setTimingTrigger(4, 1);
+				_globals[kLanternStatus] = 1;
+				_vm->_dialogs->spinObject(OBJ_LANTERN);
+				break;
+
+			case 1:
+				_vm->_dialogs->show(825);
+				break;
+
+			default:
+				break;
+			}
+		}
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_TURN_OFF, NOUN_LANTERN)) {
+		if ((_globals[kLanternStatus] == 0) && !_trigger)
+			_vm->_dialogs->show(829);
+		else if ((_scene._currentSceneId / 100) == 4)
+			_vm->_dialogs->show(826);
+		else {
+			switch (_trigger) {
+			case 0:
+				_scene._sequences.setTimingTrigger(4, 1);
+				_globals[kLanternStatus] = 0;
+				_vm->_dialogs->spinObject(OBJ_LANTERN);
+				break;
+
+			case 1:
+				_vm->_dialogs->show(827);
+				break;
+
+			default:
+				break;
+			}
+		}
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_OPEN, NOUN_ENVELOPE)) {
+		_objects.setRoom(OBJ_ENVELOPE, NOWHERE);
+		_objects.addToInventory(OBJ_TICKET);
+		_objects.addToInventory(OBJ_PIECE_OF_PAPER);
+		_vm->_dialogs->show(833);
+		action._inProgress = false;
+		return;
+	}
+
+	if (action.isAction(VERB_ATTACH, NOUN_CABLE_HOOK, NOUN_ROPE)) {
+		if (!_objects.isInInventory(OBJ_ROPE))
+			_vm->_dialogs->show(11438);
+		else {
+			_objects.setRoom(OBJ_CABLE_HOOK, NOWHERE);
+			_objects.setRoom(OBJ_ROPE, NOWHERE);
+			_objects.addToInventory(OBJ_ROPE_WITH_HOOK);
+			_vm->_dialogs->showItem(OBJ_ROPE_WITH_HOOK, 823, 0);
+		}
+		action._inProgress = false;
+	}
 }
 
 void GamePhantom::unhandledAction() {
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 6c3f2fc..2a4a0bc 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -92,6 +92,7 @@ class GamePhantom : public Game {
 	friend class Game;
 
 private:
+	void global_object_examine();
 	Catacombs *_catacombs;
 	int _catacombSize;
 
diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index 4afa6e6..3ad292d 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -57,6 +57,8 @@ enum Verb {
 	VERB_LOCK = 0x5D,
 	VERB_LOOK_AT = 0x60,
 	VERB_LOOK_THROUGH = 0x61,
+	VERB_READ = 0x7A,
+	VERB_REMOVE = 0x7C,
 	VERB_TURN_OFF = 0x95,
 	VERB_TURN_ON = 0x96,
 	VERB_UNLOCK = 0x97,
@@ -64,12 +66,14 @@ enum Verb {
 	VERB_WALK_DOWN = 0x9A,
 	VERB_WALK_THROUGH = 0x9B,
 	VERB_WALK_UP = 0x9C,
+	VERB_WEAR = 0xA1,
 	VERB_CLIMB_UP = 0xA5,
 	VERB_WALK_ONTO = 0xA6,
 	VERB_WALK = 0xA7,
 	VERB_ENTER = 0xEC,
 	VERB_WALK_BEHIND = 0xF3,
 	VERB_CLIMB = 0x120,
+	VERB_ATTACH = 0x131,
 	VERB_GRAPPLE = 0x133,
 	VERB_SIT_ON = 0x138,
 	VERB_SIT_IN = 0x13A,
@@ -176,9 +180,7 @@ enum Noun {
 	NOUN_PROSCENIUM_ARCH = 0x77,
 	NOUN_PURCHASE_LINES = 0x78,
 	NOUN_RAILING = 0x79,
-	NOUN_READ = 0x7A,
 	NOUN_RED_FRAME = 0x7B,
-	NOUN_REMOVE = 0x7C,
 	NOUN_ROPE = 0x7D,
 	NOUN_RUG = 0x7E,
 	NOUN_SANDBAG = 0x7F,
@@ -208,7 +210,6 @@ enum Noun {
 	NOUN_WARDROBE = 0x9E,
 	NOUN_WASTE_BASKET = 0x9F,
 	NOUN_WATER_PIPE = 0xA0,
-	NOUN_WEAR = 0xA1,
 	NOUN_WEDDING_RING = 0xA2,
 	NOUN_YELLOW_FRAME = 0xA3,
 	NOUN_PROP = 0xA4,
@@ -346,7 +347,6 @@ enum Noun {
 	NOUN_MONSIEUR_RICHARD = 0x12E,
 	NOUN_JULIE2 = 0x12F,
 	NOUN_CABLE_HOOK = 0x130,
-	NOUN_ATTACH = 0x131,
 	NOUN_ROPE_WITH_HOOK = 0x132,
 	NOUN_OAR = 0x134,
 	NOUN_ORGAN = 0x135,


Commit: b177f6326fb8658068dd5db8694db98e9089fc91
    https://github.com/scummvm/scummvm/commit/b177f6326fb8658068dd5db8694db98e9089fc91
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T18:33:13+01:00

Commit Message:
MADS: Phantom: Implement unhandledAction()

Changed paths:
    engines/mads/phantom/game_phantom.cpp



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index cd01c58..dec4832 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -551,7 +551,88 @@ void GamePhantom::doObjectAction() {
 }
 
 void GamePhantom::unhandledAction() {
-	// TODO
+	int messageId = 0;
+	int rndNum = _vm->getRandomNumber(1, 1000);
+	MADSAction &action = _scene._action;
+
+	if (action.isAction(VERB_PUT, NOUN_CHANDELIER, NOUN_SEATS))
+		_vm->_dialogs->show(10123);
+	else if (action.isAction(VERB_TAKE)) {
+		if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId)))
+			messageId = 25;
+		else {
+			if (rndNum <= 333)
+				messageId = 1;
+			else if (rndNum <= 666)
+				messageId = 2;
+			else
+				messageId = 3;
+		}
+	} else if (action.isAction(VERB_PUSH)) {
+		if (rndNum < 750)
+			messageId = 4;
+		else
+			messageId = 5;
+	} else if (action.isAction(VERB_PULL)) {
+		if (rndNum < 750)
+			messageId = 6;
+		else
+			messageId = 7;
+	} else if (action.isAction(VERB_OPEN)) {
+		if (rndNum <= 500)
+			messageId = 8;
+		else if (rndNum <= 750)
+			messageId = 9;
+		else
+			messageId = 10;
+	} else if (action.isAction(VERB_CLOSE)) {
+		if (rndNum <= 500)
+			messageId = 11;
+		else if (rndNum <= 750)
+			messageId = 12;
+		else
+			messageId = 13;
+	} else if (action.isAction(VERB_PUT)) {
+		if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId)))
+			messageId = 26;
+		else if (rndNum < 500)
+			messageId = 14;
+		else
+			messageId = 15;
+	} else if (action.isAction(VERB_TALK_TO)) {
+		if (rndNum <= 500)
+			messageId = 16;
+		else
+			messageId = 17;
+	} else if (action.isAction(VERB_GIVE)) {
+		if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId)))
+			messageId = 27;
+		else
+			messageId = 18;
+	} else if (action.isAction(VERB_THROW)) {
+		if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId)))
+			messageId = 19;
+		else
+			messageId = 28;
+	} else if (action.isAction(VERB_LOOK)) {
+		if (rndNum <= 333)
+			messageId = 20;
+		else if (rndNum <= 666)
+			messageId = 21;
+		else
+			messageId = 22;
+	} else if ((action.isAction(VERB_UNLOCK) || action.isAction(VERB_LOCK))
+			&& (action.isObject(NOUN_DOOR) || action.isObject(NOUN_LEFT_DOOR) || action.isObject(NOUN_MIDDLE_DOOR) || action.isObject(NOUN_RIGHT_DOOR) || action.isObject(NOUN_TRAP_DOOR)))
+		messageId = 32;
+	else if (!action.isAction(VERB_WALK_TO) && !action.isAction(VERB_WALK_ACROSS) && !action.isAction(VERB_WALK_DOWN) && !action.isAction(VERB_WALK_UP)) {
+		if (rndNum < 500)
+			messageId = 23;
+		else
+			messageId = 24;
+	}
+
+	if (messageId)
+		_vm->_dialogs->show(messageId);
 }
 
 void GamePhantom::step() {


Commit: 925dc6b158ea7a63bdfbb9b8e0484a89dcbdde29
    https://github.com/scummvm/scummvm/commit/925dc6b158ea7a63bdfbb9b8e0484a89dcbdde29
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T21:09:04+01:00

Commit Message:
MADS: Phantom: Implement stopWalker()

Changed paths:
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index dec4832..414b4b1 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -259,7 +259,7 @@ void GamePhantom::checkShowDialog() {
 	}
 }
 
-void GamePhantom::global_object_examine() {
+void GamePhantom::genericObjectExamine() {
 	MADSAction &action = _scene._action;
 	int	id = _objects.getIdFromDesc(action._activeAction._objectNameId);
 
@@ -475,7 +475,7 @@ void GamePhantom::doObjectAction() {
 	}
 
 	if (action.isAction(VERB_LOOK) && _objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) {
-		global_object_examine();
+		genericObjectExamine();
 		action._inProgress = false;
 		return;
 	}
@@ -635,13 +635,185 @@ void GamePhantom::unhandledAction() {
 		_vm->_dialogs->show(messageId);
 }
 
+void GamePhantom::stopWalker() {
+	int state   = _globals[kWalkerConverseState];
+	int command = _globals[kWalkerConverse];
+
+	_globals[kWalkerConverseNow] = state;
+
+	if ((_player._facing != FACING_NORTHEAST) && (_player._facing != FACING_NORTHWEST)) {
+		state   = 0;
+		command = 0;
+	}
+
+	switch (state) {
+	case 1:
+		switch (command) {
+		case 1:
+			_player.addWalker(3, 0);
+			break;
+
+		case 2:
+		case 3:
+			_player.addWalker(6, 0);
+			_player.addWalker(5, 0);
+			_player.addWalker(4, 0);
+			state = 2;
+			break;
+
+		case 4:
+			_player.addWalker(8, 0);
+			_player.addWalker(4, 0);
+			state = 4;
+			break;
+
+		default:
+			_player.addWalker(-2, 0);
+			state = 0;
+			break;
+		}
+		break;
+
+	case 2:
+	case 3:
+		switch (command) {
+		case 2:
+		case 3:
+			if (state == 2) {
+				if (_vm->getRandomNumber(1, 30000) < 2000) {
+					_player.addWalker(10, 0);
+					_player.addWalker(7, 0);
+					state = 3;
+				} else
+					_player.addWalker(6, 0);
+			} else {
+				if (_vm->getRandomNumber(1, 30000) < 1000) {
+					_player.addWalker(6, 0);
+					_player.addWalker(7, 0);
+					state = 2;
+				} else
+					_player.addWalker(10, 0);
+			}
+			break;
+
+		default:
+			_player.addWalker(-4, 0);
+			_player.addWalker(-5, 0);
+			if (state == 3) {
+				_player.addWalker(6, 0);
+				_player.addWalker(7, 0);
+			}
+			state = 1;
+			break;
+		}
+		break;
+
+	case 4:
+		if (command == 4)
+			_player.addWalker(9, 0);
+		else {
+			_player.addWalker(-4, 0);
+			_player.addWalker(-8, 0);
+			state = 1;
+		}
+		break;
+
+	case 0:
+	default:
+		switch (command) {
+		case 1:
+		case 2:
+		case 3:
+		case 4:
+			_player.addWalker(2, 0);
+			state = 1;
+			break;
+
+		default:
+			stopWalkerBasic();
+			break;
+		}
+		break;
+	}
+
+	_globals[kWalkerConverse]       = command;
+	_globals[kWalkerConverseState] = state;
+}
+
 void GamePhantom::step() {
-	if (_player._visible && _player._stepEnabled && !_player._moving &&
-		(_player._facing == _player._turnToFacing)) {
+	if (_player._visible  && !_globals[kStopWalkerDisabled]
+	 && (_player._stepEnabled || (_vm->_gameConv->_running >= 0))
+	 && !_player._moving && (_player._facing == _player._turnToFacing)
+	 && (_scene._frameStartTime >= *((uint32 *)&_globals[kWalkerTiming]))) {
+		if (!_player._stopWalkerIndex)
+			stopWalker();
 
-		// TODO
+		*((uint32 *)&_globals[kWalkerTiming]) += 6;
 	}
+}
+
+void GamePhantom::stopWalkerBasic() {
+	int rndVal  = _vm->getRandomNumber(1, 30000);
+
+	switch (_player._facing) {
+	case FACING_SOUTH:
+		if (rndVal < 500) {
+			int maxSteps = _vm->getRandomNumber(4, 10);
+			for (int i = 0; i < maxSteps; i++)
+				_player.addWalker((rndVal < 250) ? 1 : 2, 0);
+		} else if (rndVal < 750) {
+			for (int i = 0; i < 4; i++)
+				_player.addWalker(1, 0);
+
+			_player.addWalker(0, 0);
 
+			for (int i = 0; i < 4; i++)
+				_player.addWalker(2, 0);
+
+			_player.addWalker(0, 0);
+		}
+		break;
+
+	case FACING_SOUTHEAST:
+	case FACING_SOUTHWEST:
+	case FACING_NORTHEAST:
+	case FACING_NORTHWEST:
+		if (rndVal < 150) {
+			_player.addWalker(-1, 0);
+			_player.addWalker(1, 0);
+			for (int i = 0; i < 6; i++)
+				_player.addWalker(0, 0);
+		}
+		break;
+
+	case FACING_EAST:
+	case FACING_WEST:
+		if (rndVal < 250) {
+			_player.addWalker(-1, 0);
+			int maxSteps = _vm->getRandomNumber(2, 6);
+			for (int i = 0; i < maxSteps; i++)
+				_player.addWalker(2, 0);
+			_player.addWalker(1, 0);
+			_player.addWalker(0, 0);
+			_player.addWalker(0, 0);
+		} else if (rndVal < 500)
+			*((uint32 *)&_globals[kWalkerTiming]) = _scene._frameStartTime;
+		break;
+
+	case FACING_NORTH:
+		if (rndVal < 250) {
+			_player.addWalker(-1, 0);
+			int maxSteps = _vm->getRandomNumber(3, 7);
+			for (int i = 0; i < maxSteps; i++)
+				_player.addWalker(2, 0);
+			_player.addWalker(1, 0);
+			_player.addWalker(0, 0);
+		}
+		break;
+
+	default:
+		break;
+	}
 }
 
 void GamePhantom::synchronize(Common::Serializer &s, bool phase1) {
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 2a4a0bc..3e2e957 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -92,7 +92,10 @@ class GamePhantom : public Game {
 	friend class Game;
 
 private:
-	void global_object_examine();
+	void genericObjectExamine();
+	void stopWalker();
+	void stopWalkerBasic();
+
 	Catacombs *_catacombs;
 	int _catacombSize;
 


Commit: 34d5f929ac2c3b3e61a5bb48968a07c62e25f3ec
    https://github.com/scummvm/scummvm/commit/34d5f929ac2c3b3e61a5bb48968a07c62e25f3ec
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T21:40:18+01:00

Commit Message:
MADS: Remove useless casts in per-game logic

Changed paths:
    engines/mads/nebular/game_nebular.cpp
    engines/mads/phantom/game_phantom.cpp



diff --git a/engines/mads/nebular/game_nebular.cpp b/engines/mads/nebular/game_nebular.cpp
index 578af51..1976bcb 100644
--- a/engines/mads/nebular/game_nebular.cpp
+++ b/engines/mads/nebular/game_nebular.cpp
@@ -824,7 +824,7 @@ void GameNebular::unhandledAction() {
 void GameNebular::step() {
 	if (_player._visible && _player._stepEnabled && !_player._moving &&
 		(_player._facing == _player._turnToFacing)) {
-		if (_scene._frameStartTime >= *((uint32 *)&_globals[kWalkerTiming])) {
+		if (_scene._frameStartTime >= (uint32)_globals[kWalkerTiming]) {
 			if (!_player._stopWalkerIndex) {
 				int randomVal = _vm->getRandomNumber(29999);
 				if (_globals[kSexOfRex] == REX_MALE) {
@@ -873,19 +873,19 @@ void GameNebular::step() {
 				}
 			}
 
-			*((uint32 *)&_globals[kWalkerTiming]) += 6;
+			_globals[kWalkerTiming] += 6;
 		}
 	}
 
 	// Below is countdown to set the timebomb off in room 604
 	if (_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) {
-		int diff = _scene._frameStartTime - *((uint32 *)&_globals[kTimebombClock]);
-		if ((diff >= 0) && (diff <= 60)) {
-			*((uint32 *)&_globals[kTimebombTimer]) += diff;
-		} else {
-			++*((uint32 *)&_globals[kTimebombTimer]);
-		}
-		*((uint32 *)&_globals[kTimebombClock]) = _scene._frameStartTime;
+		int diff = _scene._frameStartTime - _globals[kTimebombClock];
+		if ((diff >= 0) && (diff <= 60))
+			_globals[kTimebombTimer] += diff;
+		else
+			++_globals[kTimebombTimer];
+
+		_globals[kTimebombClock] = (int) _scene._frameStartTime;
 	}
 }
 
diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 414b4b1..9ed8d24 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -744,11 +744,11 @@ void GamePhantom::step() {
 	if (_player._visible  && !_globals[kStopWalkerDisabled]
 	 && (_player._stepEnabled || (_vm->_gameConv->_running >= 0))
 	 && !_player._moving && (_player._facing == _player._turnToFacing)
-	 && (_scene._frameStartTime >= *((uint32 *)&_globals[kWalkerTiming]))) {
+	 && (_scene._frameStartTime >= (uint32)_globals[kWalkerTiming])) {
 		if (!_player._stopWalkerIndex)
 			stopWalker();
 
-		*((uint32 *)&_globals[kWalkerTiming]) += 6;
+		_globals[kWalkerTiming] += 6;
 	}
 }
 
@@ -797,7 +797,7 @@ void GamePhantom::stopWalkerBasic() {
 			_player.addWalker(0, 0);
 			_player.addWalker(0, 0);
 		} else if (rndVal < 500)
-			*((uint32 *)&_globals[kWalkerTiming]) = _scene._frameStartTime;
+			_globals[kWalkerTiming] = (int)_scene._frameStartTime;
 		break;
 
 	case FACING_NORTH:


Commit: b7d4536cf1f791483f3293f9bdea465331fa465c
    https://github.com/scummvm/scummvm/commit/b7d4536cf1f791483f3293f9bdea465331fa465c
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T21:42:51+01:00

Commit Message:
MADS: Phantom: Update erroneous comments concerning Section Handlers

Changed paths:
    engines/mads/phantom/game_phantom.h



diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
index 3e2e957..2f0204f 100644
--- a/engines/mads/phantom/game_phantom.h
+++ b/engines/mads/phantom/game_phantom.h
@@ -132,18 +132,16 @@ public:
 	void newCatacombRoom(int fromRoom, int fromExit);
 };
 
-
+// Section handlers aren't needed in ScummVM implementation
 class Section1Handler : public SectionHandler {
 public:
 	Section1Handler(MADSEngine *vm) : SectionHandler(vm) {}
 
-	// TODO: Properly implement handler methods
 	virtual void preLoadSection() {}
 	virtual void sectionPtr2() {}
 	virtual void postLoadSection() {}
 };
 
-// TODO: Properly implement handler classes
 typedef Section1Handler Section2Handler;
 typedef Section1Handler Section3Handler;
 typedef Section1Handler Section4Handler;


Commit: cbb26351f1824c5a72f798dfeca3b6ee7683ae18
    https://github.com/scummvm/scummvm/commit/cbb26351f1824c5a72f798dfeca3b6ee7683ae18
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-09T21:44:26+01:00

Commit Message:
MADS: Phantom: Remove dummy scene handler

Changed paths:
    engines/mads/phantom/phantom_scenes.h



diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index 3ad292d..ca61ed7 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -484,18 +484,6 @@ protected:
 	SceneInfoPhantom(MADSEngine *vm) : SceneInfo(vm) {}
 };
 
-// TODO: Temporary, remove once implemented properly
-class DummyScene : public PhantomScene {
-public:
-	DummyScene(MADSEngine *vm) : PhantomScene(vm) {
-		warning("Unimplemented scene");
-	}
-
-	virtual void setup() {}
-	virtual void enter() {}
-	virtual void actions() {}
-};
-
 } // End of namespace Phantom
 
 } // End of namespace MADS


Commit: a71fd5760861a11eb74495b967d697ec32ec88f6
    https://github.com/scummvm/scummvm/commit/a71fd5760861a11eb74495b967d697ec32ec88f6
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-10T09:04:25+01:00

Commit Message:
MADS: Implement SetSeqPlayer for V2+ games, replace setTrigger by addSubEntry

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/scene.h
    engines/mads/sequence.cpp
    engines/mads/sequence.h



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 9ef8768..36840df 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -378,7 +378,7 @@ void Scene102::step() {
 			_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 9, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 71);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 			break;
 
 		case 71: {
@@ -410,8 +410,8 @@ void Scene102::actions() {
 			_game._player._visible = false;
 			_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], true, 8, 2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 2, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 3);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 			break;
 
 		case 1:
@@ -419,7 +419,7 @@ void Scene102::actions() {
 			_vm->_sound->command(24);
 			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 2: {
@@ -747,7 +747,7 @@ void Scene103::step() {
 		_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 3);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 71);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 		break;
 
 	case 71: {
@@ -765,7 +765,7 @@ void Scene103::step() {
 		_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 3);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 73);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
 		break;
 
 	case 73: {
@@ -796,8 +796,8 @@ void Scene103::actions() {
 			_game._player._visible = false;
 			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 7, 2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 2, 2, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 3);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 			break;
 
 		case 1:
@@ -805,7 +805,7 @@ void Scene103::actions() {
 			_vm->_sound->command(24);
 			_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 2: {
@@ -832,7 +832,7 @@ void Scene103::actions() {
 			_vm->_sound->command(25);
 			_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 6);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
 			break;
 
 		case 6: {
@@ -862,8 +862,8 @@ void Scene103::actions() {
 			_game._player._visible = false;
 			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], true, 7, 2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 2, 2, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 3);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 			break;
 
 		case 1:
@@ -871,7 +871,7 @@ void Scene103::actions() {
 			_vm->_sound->command(24);
 			_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 7, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 2: {
@@ -898,7 +898,7 @@ void Scene103::actions() {
 			_vm->_sound->command(25);
 			_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 7, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 6);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
 			break;
 
 		case 6: {
@@ -1410,7 +1410,7 @@ void Scene104::step() {
 		_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 71);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 		break;
 
 	case 71: {
@@ -1534,8 +1534,8 @@ void Scene104::actions() {
 				_game._player._visible = false;
 				_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 8, 2);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 2, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 			case 1:
@@ -1543,7 +1543,7 @@ void Scene104::actions() {
 				_vm->_sound->command(24);
 				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 2: {
@@ -1570,7 +1570,7 @@ void Scene104::actions() {
 				_vm->_sound->command(25);
 				_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 7, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 6);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
 				break;
 
 			case 6: {
@@ -1605,14 +1605,14 @@ void Scene104::actions() {
 				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 3, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 3, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 			case 1:
 				_globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[12], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 2: {
@@ -1669,8 +1669,8 @@ void Scene104::actions() {
 				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 3, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 3, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 			case 1:
@@ -2677,7 +2677,7 @@ void Scene104::handleMacAnimation1() {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 85);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 85);
 		break;
 
 	case 112:
diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
index ca61ed7..a6a8395 100644
--- a/engines/mads/phantom/phantom_scenes.h
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -485,7 +485,6 @@ protected:
 };
 
 } // End of namespace Phantom
-
 } // End of namespace MADS
 
 #endif /* MADS_PHANTOM_SCENES_H */
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index a1b3fbd..3bfb821 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -1160,7 +1160,7 @@ void Scene103::step() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 6);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 		_vm->_sound->command(66);
 		break;
 
@@ -1187,7 +1187,7 @@ void Scene103::step() {
 	case 100:
 		_scene->deleteSequence(_globals._sequenceIndexes[10]);
 		_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 101);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 101);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], -1, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
 		break;
@@ -1215,7 +1215,7 @@ void Scene103::step() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 105);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 105);
 			}
 		} else if (_anim2ActvFl) {
 			if ((_scene->getAnimFrame(_globals._animationIndexes[2]) == 7) && !_guardFrameFl) {
@@ -1226,7 +1226,7 @@ void Scene103::step() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 110);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 110);
 			}
 		}
 		break;
@@ -1600,8 +1600,8 @@ void Scene103::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 2, 3, 70);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 3, 70);
 				break;
 
 			case 2:
@@ -1621,7 +1621,7 @@ void Scene103::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 71);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 				_vm->_sound->command(66);
 				break;
 
@@ -1644,7 +1644,7 @@ void Scene103::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				break;
 
 			case 1: {
@@ -1662,7 +1662,7 @@ void Scene103::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 			case 3:
@@ -1692,8 +1692,8 @@ void Scene103::actions() {
 			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			_action._inProgress = false;
 			return;
 
@@ -1753,7 +1753,7 @@ void Scene103::actions() {
 				_globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 5);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[11], 0, 0, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				break;
 
 			case 1:
@@ -1780,7 +1780,7 @@ void Scene103::actions() {
 				_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				if (!_sitFl)
 					_game.syncTimers(1, _globals._sequenceIndexes[10], 3, _globals._animationIndexes[5]);
 				_sitFl = false;
@@ -2693,7 +2693,7 @@ void Scene104::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 16);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
 				break;
 
 			case 60:
@@ -2737,7 +2737,7 @@ void Scene104::actions() {
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, 4);
 			_scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 			break;
 
 		case 1:
@@ -3715,7 +3715,7 @@ void Scene105::step() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 61);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 		_vm->_sound->command(66);
 		break;
 
@@ -3832,8 +3832,8 @@ void Scene105::actions() {
 			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 5, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
@@ -3871,8 +3871,8 @@ void Scene105::actions() {
 			_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 2, 4, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
@@ -3910,8 +3910,8 @@ void Scene105::actions() {
 				_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 2, 4, 65);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 4, 65);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 2:
@@ -3929,7 +3929,7 @@ void Scene105::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 				_vm->_sound->command(66);
 				break;
 
@@ -3953,7 +3953,7 @@ void Scene105::actions() {
 				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], true, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				break;
 
 			case 1: {
@@ -3971,7 +3971,7 @@ void Scene105::actions() {
 				_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], true, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 			case 3:
@@ -4306,7 +4306,7 @@ void Scene106::step() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 61);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 		break;
 
 	case 61:
@@ -4335,8 +4335,8 @@ void Scene106::actions() {
 				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -4374,9 +4374,8 @@ void Scene106::actions() {
 				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5],
-					2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				_globals[kPlayerScore] += 5;
 				break;
 
@@ -4480,7 +4479,7 @@ void Scene106::actions() {
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 9);
 				_scene->_sequences.setTimingTrigger(6, 2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				break;
 
 			case 1:
@@ -4524,8 +4523,8 @@ void Scene106::actions() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 4, 65);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 67);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 65);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 67);
 			break;
 
 		case 65:
@@ -4534,7 +4533,7 @@ void Scene106::actions() {
 			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 			break;
 
 		case 66: {
@@ -4556,7 +4555,7 @@ void Scene106::actions() {
 			_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 69);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 69);
 			break;
 
 		case 69:
@@ -4833,8 +4832,8 @@ void Scene107::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
@@ -5730,7 +5729,7 @@ void Scene109::step() {
 		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 3);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 		break;
 
 	case 61:
@@ -5748,7 +5747,7 @@ void Scene109::step() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 		break;
 
 	case 66:
@@ -5949,8 +5948,8 @@ void Scene109::actions() {
 			_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 4, 75);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 4, 75);
 			break;
 
 		case 2:
@@ -5977,14 +5976,12 @@ void Scene109::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 3);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0],
-					0, 0, 76);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
 			} else if (_currentFloor == 2) {
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1],
-					0, 0, 76);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
 			}
 			break;
 
@@ -6179,7 +6176,7 @@ void Scene110::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 			break;
 
 		case 1: {
@@ -6197,7 +6194,7 @@ void Scene110::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 			break;
 
 		case 3:
@@ -6229,7 +6226,7 @@ void Scene110::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				break;
 
 			case 1: {
@@ -6247,7 +6244,7 @@ void Scene110::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 			case 3:
@@ -6273,8 +6270,8 @@ void Scene110::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 7, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 4, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				break;
 
 			case 1:
@@ -6282,7 +6279,7 @@ void Scene110::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 10, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 2:
@@ -6598,7 +6595,7 @@ void Scene111::step() {
 	case 60:
 		_scene->deleteSequence(_globals._sequenceIndexes[5]);
 		_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 7, 1);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 62);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 62);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
 		break;
@@ -6655,7 +6652,7 @@ void Scene111::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 			_action._inProgress = false;
 			return;
 
@@ -6675,7 +6672,7 @@ void Scene111::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 3);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 			_action._inProgress = false;
 			return;
 
@@ -6705,7 +6702,7 @@ void Scene111::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				_action._inProgress = false;
 				return;
 
@@ -6725,7 +6722,7 @@ void Scene111::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				_action._inProgress = false;
 				return;
 
@@ -9238,8 +9235,8 @@ void Scene114::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 6, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 3, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 3, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 1d967a4..0ae990a 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -764,7 +764,7 @@ void Scene202::step() {
 		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 		break;
 
 	case 61:
@@ -837,8 +837,8 @@ void Scene202::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 4, 80);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 82);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 4, 80);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 82);
 			break;
 
 		case 80:
@@ -846,7 +846,7 @@ void Scene202::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 81);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
 			_vm->_sound->command(24);
 			break;
 
@@ -869,7 +869,7 @@ void Scene202::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 84);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 84);
 			_vm->_sound->command(25);
 			break;
 
@@ -1718,7 +1718,7 @@ void Scene203::step() {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 10);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 96);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 96);
 		break;
 
 	case 96:
@@ -1761,8 +1761,8 @@ void Scene203::actions() {
 			_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 90);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 92);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 90);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 92);
 			break;
 
 		case 90:
@@ -1771,7 +1771,7 @@ void Scene203::actions() {
 			_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 91);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
 			break;
 
 		case 91:
@@ -2269,7 +2269,7 @@ void Scene203::handleRichardAndDaaeConversation() {
 			_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 90);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
 			interlocutorFl = true;
 			heroFl = true;
 		}
@@ -3490,7 +3490,7 @@ void Scene204::step() {
 		 _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
 		 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
 		 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-		 _scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 71);
+		 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 	} else if (_game._trigger == 71) {
 		 _vm->_sound->command(25);
 		 _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
@@ -3515,8 +3515,8 @@ void Scene204::actions() {
 			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 4, 60);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 61);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 4, 60);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 			break;
 
 		case 60:
@@ -3553,8 +3553,8 @@ void Scene204::actions() {
 			_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 8, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 8, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
@@ -4468,8 +4468,8 @@ void Scene205::step() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], true, 5, 2);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 102);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 2, 4, 101);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 102);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 4, 101);
 		break;
 
 	case 101:
@@ -4494,7 +4494,7 @@ void Scene205::step() {
 		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 91);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
 		break;
 
 	case 91:
@@ -4509,7 +4509,7 @@ void Scene205::step() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 96);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 96);
 		break;
 
 	case 96:
@@ -4591,7 +4591,7 @@ void Scene205::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				_action._inProgress = false;
 				return;
 
@@ -4611,7 +4611,7 @@ void Scene205::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 3);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 				_action._inProgress = false;
 				return;
 
@@ -4639,8 +4639,8 @@ void Scene205::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 2, 4, 80);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 4, 80);
 				_action._inProgress = false;
 				return;
 
@@ -4651,13 +4651,13 @@ void Scene205::actions() {
 					_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 81);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
 				} else if (_action.isObject(NOUN_BOX_NINE)) {
 					_scene->deleteSequence(_globals._sequenceIndexes[1]);
 					_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 81);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
 				}
 				_action._inProgress = false;
 				return;
@@ -5928,7 +5928,7 @@ void Scene206::step() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 83);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
 		break;
 
 	case 83:
@@ -5976,7 +5976,7 @@ void Scene206::step() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 85);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 85);
 		break;
 
 	case 85:
@@ -6015,8 +6015,8 @@ void Scene206::actions() {
 			_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 4, 77);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 78);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 4, 77);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 78);
 			_action._inProgress = false;
 			return;
 
@@ -6056,8 +6056,8 @@ void Scene206::actions() {
 				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 7, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 3, 70);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 71);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 70);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 				break;
 
 			case 70:
@@ -6083,7 +6083,7 @@ void Scene206::actions() {
 				_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 73);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
 				break;
 
 			case 73:
@@ -6103,8 +6103,8 @@ void Scene206::actions() {
 				_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 7, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 74);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 2, 3, 75);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 74);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 75);
 				break;
 
 			case 74:
@@ -6135,7 +6135,7 @@ void Scene206::actions() {
 				_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], true, 7, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 64);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 64);
 				break;
 
 			case 64: {
@@ -6153,7 +6153,7 @@ void Scene206::actions() {
 				_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], true, 7, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], false);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 66);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 				break;
 
 			case 66:
@@ -6399,7 +6399,7 @@ void Scene207::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 7, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 			break;
 
 		case 1:
@@ -6413,7 +6413,7 @@ void Scene207::actions() {
 			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 4);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
 			break;
 
 		case 3:
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index f2b709c..4ce543f 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -182,7 +182,7 @@ void Scene301::enter() {
 		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 64);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 64);
 	}
 
 	sceneEntrySound();
@@ -515,8 +515,8 @@ void Scene302::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
@@ -1640,7 +1640,7 @@ void Scene307::step() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 61);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 		break;
 
 	case 61:
@@ -1675,8 +1675,8 @@ void Scene307::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
@@ -1716,8 +1716,8 @@ void Scene307::actions() {
 			_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 70);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 72);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 70);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
 			break;
 
 		case 70:
@@ -1725,7 +1725,7 @@ void Scene307::actions() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 71);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
 			break;
 
 		case 71: {
@@ -2328,7 +2328,7 @@ void Scene309::step() {
 		_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 66);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 		break;
 
 	case 66:
@@ -2374,8 +2374,8 @@ void Scene309::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 4, 60);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 62);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 4, 60);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 62);
 			break;
 
 		case 60:
@@ -2383,7 +2383,7 @@ void Scene309::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 			_vm->_sound->command(24);
 			break;
 
@@ -2407,7 +2407,7 @@ void Scene309::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 64);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 64);
 				_vm->_sound->command(25);
 			} else
 				_scene->setAnimFrame(_globals._animationIndexes[0], 186);
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index cdecc11..997eae3 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -248,8 +248,8 @@ void Scene401::actions() {
 					_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 					break;
 
 				case 1:
@@ -323,8 +323,8 @@ void Scene401::actions() {
 					_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 					break;
 
 				case 1:
@@ -745,8 +745,8 @@ void Scene403::actions() {
 				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -819,8 +819,8 @@ void Scene403::actions() {
 				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -1257,8 +1257,8 @@ void Scene404::actions() {
 				_globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[9], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -1330,8 +1330,8 @@ void Scene404::actions() {
 				_globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[9], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -1667,8 +1667,8 @@ void Scene406::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -1741,8 +1741,8 @@ void Scene406::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -1881,7 +1881,7 @@ void Scene406::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], true, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 2:
@@ -1895,7 +1895,7 @@ void Scene406::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], true, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 4);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
 			break;
 
 		case 4:
@@ -2129,8 +2129,8 @@ void Scene407::actions() {
 					_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 					break;
 
 				case 1:
@@ -2207,8 +2207,8 @@ void Scene407::actions() {
 						_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
 						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
 						_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-						_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
-						_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 						break;
 
 					case 1:
@@ -2598,8 +2598,8 @@ void Scene408::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -2673,8 +2673,8 @@ void Scene408::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -2969,7 +2969,7 @@ void Scene409::enter() {
 					_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -1, -2);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 65);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 65);
 				}
 			} else {
 				_globals[kFlickedLever1] = 0;
@@ -2980,8 +2980,8 @@ void Scene409::enter() {
 				_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 15, 60);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 61);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 15, 60);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 				_vm->_sound->command(68);
 			}
 		} else {
@@ -3081,8 +3081,8 @@ void Scene409::actions() {
 			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 4, 4);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 4, 4);
 			_action._inProgress = false;
 			return;
 
@@ -3101,7 +3101,7 @@ void Scene409::actions() {
 			_globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], false);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 3);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 			_action._inProgress = false;
 			return;
 
@@ -3135,8 +3135,8 @@ void Scene409::actions() {
 					_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 					break;
 
 				case 1:
@@ -3210,8 +3210,8 @@ void Scene409::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -3283,8 +3283,8 @@ void Scene409::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1:
@@ -3413,7 +3413,7 @@ void Scene409::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 2:
@@ -3427,7 +3427,7 @@ void Scene409::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 4);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
 			break;
 
 		case 4:
@@ -3705,8 +3705,8 @@ void Scene410::actions() {
 
 				_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(pos.x + 4, pos.y + 107));
 				if (!_globals[kDoorIn409IsOpen])
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 16, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 2);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 16, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
@@ -3742,7 +3742,7 @@ void Scene410::actions() {
 						_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
 						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
-						_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 4);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
 						_scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos);
 						break;
 
@@ -3751,7 +3751,7 @@ void Scene410::actions() {
 						_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
 						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
-						_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 4);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
 						_scene->_sequences.setPosition(_globals._sequenceIndexes[1], pos);
 						break;
 
@@ -3760,7 +3760,7 @@ void Scene410::actions() {
 						_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
 						_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
-						_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 4);
+						_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
 						_scene->_sequences.setPosition(_globals._sequenceIndexes[2], pos);
 						break;
 
@@ -4308,8 +4308,8 @@ void Scene453::actions() {
 					_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 					break;
 
 				case 1:
@@ -4383,8 +4383,8 @@ void Scene453::actions() {
 					_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 2);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 					break;
 
 				case 1:
@@ -4734,8 +4734,8 @@ void Scene456::actions() {
 					_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 					break;
 
 				case 1:
@@ -4810,8 +4810,8 @@ void Scene456::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				break;
 
 			case 1:
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 6a3644f..2468de0 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -170,7 +170,7 @@ void Scene501::step() {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 56);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 56);
 		break;
 
 	case 56:
@@ -193,7 +193,7 @@ void Scene501::step() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 61);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 		break;
 
 	case 61:
@@ -224,7 +224,7 @@ void Scene501::step() {
 		_game._player._visible = false;
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 9, 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 90);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
 		break;
 
 	default:
@@ -294,7 +294,7 @@ void Scene501::actions() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 			break;
 
 		case 1: {
@@ -312,7 +312,7 @@ void Scene501::actions() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 3);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 			break;
 
 		case 3:
@@ -339,7 +339,7 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 					break;
 
 				case 1: {
@@ -357,7 +357,7 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 3);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 					break;
 
 				case 3:
@@ -378,8 +378,8 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 4, 65);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 67);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 65);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 67);
 					break;
 
 				case 65:
@@ -387,7 +387,7 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 66);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 					_vm->_sound->command(24);
 					break;
 
@@ -417,8 +417,8 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 2, 4, 65);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 67);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 65);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 67);
 					break;
 
 				case 65: {
@@ -428,7 +428,7 @@ void Scene501::actions() {
 					_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 66);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 					_vm->_sound->command(24);
 					}
 					break;
@@ -446,7 +446,7 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 69);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 69);
 					_vm->_sound->command(25);
 					break;
 
@@ -464,7 +464,7 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 1);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 					break;
 
 				case 1: {
@@ -482,7 +482,7 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
-					_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 3);
+					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
 					break;
 
 				case 3:
@@ -850,10 +850,10 @@ void Scene502::step() {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 72);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 44, 73);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 51, 74);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 32, 75);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 44, 73);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 51, 74);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 32, 75);
 		break;
 
 	case 72:
@@ -887,7 +887,7 @@ void Scene502::step() {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 78);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 78);
 		break;
 
 	case 78:
@@ -933,8 +933,8 @@ void Scene502::actions() {
 		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 14, 18);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 91);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 2, 18, 110);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 18, 110);
 		_action._inProgress = false;
 		return;
 
@@ -953,8 +953,8 @@ void Scene502::actions() {
 		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 8, 13);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 96);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 2, 13, 110);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 96);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 13, 110);
 		_action._inProgress = false;
 		return;
 
@@ -973,8 +973,8 @@ void Scene502::actions() {
 		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 5, 7);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 101);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 2, 7, 110);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 101);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 7, 110);
 		_action._inProgress = false;
 		return;
 
@@ -998,8 +998,8 @@ void Scene502::actions() {
 		_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 4);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 0, 0, 106);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[10], 2, 4, 110);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 106);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 4, 110);
 		_action._inProgress = false;
 		return;
 
@@ -1064,8 +1064,8 @@ void Scene502::actions() {
 				_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 13);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 82);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 10, 83);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 82);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 10, 83);
 				_game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE);
 				break;
 
@@ -1122,7 +1122,7 @@ void Scene502::actions() {
 			_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 10);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 82);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 82);
 			break;
 
 		case 82:
@@ -1353,7 +1353,7 @@ void Scene502::animateFireBursts() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 10);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 61);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 		}
 		break;
 
@@ -1366,7 +1366,7 @@ void Scene502::animateFireBursts() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 10);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 64);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 64);
 		}
 		break;
 
@@ -1379,7 +1379,7 @@ void Scene502::animateFireBursts() {
 			_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 10);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[2], 0, 0, 67);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 67);
 		}
 		break;
 
@@ -1392,7 +1392,7 @@ void Scene502::animateFireBursts() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 10);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 70);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
 		}
 		break;
 
@@ -1569,7 +1569,7 @@ void Scene502::handlePanelAnimation() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[16], 14);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[16], _nextPos);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[16], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[16], 0, 0, 112);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[16], SEQUENCE_TRIGGER_EXPIRE, 0, 112);
 		break;
 
 	case 112: {
@@ -2181,21 +2181,21 @@ void Scene504::step() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 90);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
 	}
 
 	if (_game._trigger == 90) {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 91);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
 	}
 
 	if (_game._trigger == 91) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[5], 0, 0, 92);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 92);
 	}
 
 	if (_game._trigger == 92)
@@ -2399,8 +2399,8 @@ void Scene504::actions() {
 				_globals._sequenceIndexes[14] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[14], false, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[14], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[14], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[14], 2, 4, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[14], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[14], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[14], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 				_action._inProgress = false;
 				return;
 			}
@@ -3349,8 +3349,8 @@ void Scene505::actions() {
 				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 9, 95);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 0, 0, 96);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 9, 95);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 96);
 				_action._inProgress = false;
 				return;
 
@@ -3386,8 +3386,8 @@ void Scene505::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], false, 5, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 6, 1);
-			_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			break;
 
 		case 1: {
@@ -4038,7 +4038,7 @@ void Scene506::step() {
 		_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-		_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 61);
+		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
 		break;
 
 	case 61:
@@ -4102,8 +4102,8 @@ void Scene506::actions() {
 				_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 1);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 2);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
 			}
 			break;
 
@@ -4142,8 +4142,8 @@ void Scene506::actions() {
 				_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 65);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 67);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 65);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 67);
 				break;
 
 			case 65:
@@ -4151,7 +4151,7 @@ void Scene506::actions() {
 				_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 66);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
 				_vm->_sound->command(24);
 				break;
 
@@ -4190,7 +4190,7 @@ void Scene506::actions() {
 				_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
 				_game.syncTimers(1, _globals._sequenceIndexes[7], 2, 0);
-				_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 90);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
 				break;
 
 			case 90:
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index 147dff8..9a9ebf7 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -265,6 +265,7 @@ public:
 	void playSpeech(int idx);
 	void sceneScale(int front_y, int front_scale, int back_y,  int back_scale);
 	void animations_tick();
+
 	int _speechReady;
 };
 
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index 52d5d12..acfb6fa 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -566,13 +566,15 @@ int SequenceList::setTimingTrigger(int delay, int code) {
 	return -1;
 }
 
-int SequenceList::setTrigger(int idx, int trigger_type, int trigger_sprite, int trigger_code) {
-	warning("TODO: SequenceList::setTrigger");
-	return -1;
-}
-
 void SequenceList::setSeqPlayer(int idx, bool flag) {
-	warning("TODO: SequenceList::setSeqPlayer");
+	Player &player = _vm->_game->_player;
+	int yp = player._playerPos.y + (player._centerOfGravity * player._currentScale) / 100;
+	setPosition(idx, Common::Point(player._playerPos.x, yp));
+	setDepth(idx, player._currentDepth);
+	setScale(idx, player._currentScale);
+
+	if (flag)
+		_vm->_game->syncTimers(1, idx, 2, 0);
 }
 
 } // End of namespace
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
index b207cc1..67b9ba7 100644
--- a/engines/mads/sequence.h
+++ b/engines/mads/sequence.h
@@ -128,7 +128,6 @@ public:
 
 	int addStampCycle(int srcSpriteIdx, bool flipped, int sprite);
 	int setTimingTrigger(int delay, int code);
-	int setTrigger(int sequence_id, int trigger_type, int trigger_sprite, int trigger_code);
 	void setSeqPlayer(int idx, bool flag);
 };
 


Commit: 7fb2ec93662823fdfe14221d308e3a53d5cb4f6a
    https://github.com/scummvm/scummvm/commit/7fb2ec93662823fdfe14221d308e3a53d5cb4f6a
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-10T09:15:55+01:00

Commit Message:
MADS: Replace the use of setTimingTrigger by a call to addTimer for V2+ games

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/sequence.cpp
    engines/mads/sequence.h



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 36840df..ee15af1 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -467,7 +467,7 @@ void Scene102::actions() {
 			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST);
 			_game._player._visible = true;
 			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
-			_scene->_sequences.setTimingTrigger(6, 2);
+			_scene->_sequences.addTimer(6, 2);
 			break;
 
 		case 2:
@@ -819,7 +819,7 @@ void Scene103::actions() {
 		case 3:
 			_game._player._visible = true;
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[11]);
-			_scene->_sequences.setTimingTrigger(1,4);
+			_scene->_sequences.addTimer(1, 4);
 			break;
 
 		case 4:
@@ -840,7 +840,7 @@ void Scene103::actions() {
 			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
 			_game.syncTimers(1, _globals._sequenceIndexes[9], 1, tmpIdx);
-			_scene->_sequences.setTimingTrigger(6, 7);
+			_scene->_sequences.addTimer(6, 7);
 			}
 			break;
 
@@ -885,7 +885,7 @@ void Scene103::actions() {
 		case 3:
 			_game._player._visible = true;
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[11]);
-			_scene->_sequences.setTimingTrigger(1,4);
+			_scene->_sequences.addTimer(1, 4);
 			break;
 
 		case 4:
@@ -906,7 +906,7 @@ void Scene103::actions() {
 			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
 			_game.syncTimers(1, _globals._sequenceIndexes[10], 1, tmpIdx);
-			_scene->_sequences.setTimingTrigger(6, 7);
+			_scene->_sequences.addTimer(6, 7);
 			}
 			break;
 
@@ -1273,7 +1273,7 @@ void Scene104::enter() {
 
 		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
-		_scene->_sequences.setTimingTrigger(60, 77);
+		_scene->_sequences.addTimer(60, 77);
 
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0);
 		_anim0ActvFl = true;
@@ -1557,7 +1557,7 @@ void Scene104::actions() {
 			case 3:
 				_game._player._visible = true;
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
-				_scene->_sequences.setTimingTrigger(1,4);
+				_scene->_sequences.addTimer(1, 4);
 				break;
 
 			case 4:
@@ -1578,7 +1578,7 @@ void Scene104::actions() {
 				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
 				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx);
-				_scene->_sequences.setTimingTrigger(6, 7);
+				_scene->_sequences.addTimer(6, 7);
 				}
 				break;
 
@@ -1630,7 +1630,7 @@ void Scene104::actions() {
 			case 3:
 				_game._player._visible = true;
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
-				_scene->_sequences.setTimingTrigger(5, 4);
+				_scene->_sequences.addTimer(5, 4);
 				break;
 
 			case 4:
@@ -1679,7 +1679,7 @@ void Scene104::actions() {
 				_scene->deleteSequence(_globals._sequenceIndexes[12]);
 				_globals._sequenceIndexes[12] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[12], false, 6, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
-				_scene->_sequences.setTimingTrigger(6, 2);
+				_scene->_sequences.addTimer(6, 2);
 				break;
 
 			case 2:
@@ -1692,7 +1692,7 @@ void Scene104::actions() {
 			case 3:
 				_game._player._visible = true;
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
-				_scene->_sequences.setTimingTrigger(5, 4);
+				_scene->_sequences.addTimer(5, 4);
 				break;
 
 			case 4:
@@ -1737,7 +1737,7 @@ void Scene104::actions() {
 							_scene->_hotspots.activate(NOUN_WALL_PANEL, true);
 							_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
 						}
-						_scene->_sequences.setTimingTrigger(6, 2);
+						_scene->_sequences.addTimer(6, 2);
 						break;
 
 					case 2:
@@ -1789,7 +1789,7 @@ void Scene104::actions() {
 						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(310, 70));
 						_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
 						_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
-						_scene->_sequences.setTimingTrigger(6, 2);
+						_scene->_sequences.addTimer(6, 2);
 						break;
 
 					case 2:
diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 9ed8d24..7e61241 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -486,7 +486,7 @@ void GamePhantom::doObjectAction() {
 		else {
 			switch (_trigger) {
 			case 0:
-				_scene._sequences.setTimingTrigger(4, 1);
+				_scene._sequences.addTimer(4, 1);
 				_globals[kLanternStatus] = 1;
 				_vm->_dialogs->spinObject(OBJ_LANTERN);
 				break;
@@ -511,7 +511,7 @@ void GamePhantom::doObjectAction() {
 		else {
 			switch (_trigger) {
 			case 0:
-				_scene._sequences.setTimingTrigger(4, 1);
+				_scene._sequences.addTimer(4, 1);
 				_globals[kLanternStatus] = 0;
 				_vm->_dialogs->spinObject(OBJ_LANTERN);
 				break;
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 3bfb821..d1d77e3 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -672,7 +672,7 @@ void Scene102::enter() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], deathDepth);
 		_scene->_sequences.setPosition(_globals._sequenceIndexes[3], deathPos);
 		_scene->_sequences.setScale(_globals._sequenceIndexes[3], deathScale);
-		_scene->_sequences.setTimingTrigger(120, 65);
+		_scene->_sequences.addTimer(120, 65);
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 	} else if (_scene->_priorSceneId == 103 || _scene->_priorSceneId != RETURNING_FROM_LOADING) {
@@ -718,7 +718,7 @@ void Scene102::actions() {
 		_action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR) ||
 		_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR)) {
 		if (_anim0Running) {
-			_scene->_sequences.setTimingTrigger(15, 70);
+			_scene->_sequences.addTimer(15, 70);
 			_game._player._stepEnabled = false;
 		} else {
 			switch (_game._trigger) {
@@ -1074,7 +1074,7 @@ void Scene103::enter() {
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4);
 			_standPosition = 1;
 			_game._player._playerPos = Common::Point(79, 132);
-			_scene->_sequences.setTimingTrigger(1, 100);
+			_scene->_sequences.addTimer(1, 100);
 		} else {
 			_standPosition = 2;
 			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 0);
@@ -1608,7 +1608,7 @@ void Scene103::actions() {
 				_game._player._visible = true;
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
 				_game._player.walk(Common::Point(295, 132), FACING_WEST);
-				_scene->_sequences.setTimingTrigger(180, 3);
+				_scene->_sequences.addTimer(180, 3);
 				break;
 
 			case 3:
@@ -1652,7 +1652,7 @@ void Scene103::actions() {
 				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
 				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, oldIdx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
-				_scene->_sequences.setTimingTrigger(15, 2);
+				_scene->_sequences.addTimer(15, 2);
 				_vm->_sound->command(73);
 				}
 				break;
@@ -1708,7 +1708,7 @@ void Scene103::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			_action._inProgress = false;
 			return;
 
@@ -2554,7 +2554,7 @@ void Scene104::enter() {
 		_game._visitedScenes.add(101);
 
 		_scene->setCamera(Common::Point(60, 0));
-		_scene->_sequences.setTimingTrigger(1, 91);
+		_scene->_sequences.addTimer(1, 91);
 
 	} else if (_scene->_priorSceneId == 103) {
 		if (_globals[kRoom103104Transition] == 0) {
@@ -2742,7 +2742,7 @@ void Scene104::actions() {
 
 		case 1:
 			_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 1, 10);
-			_scene->_sequences.setTimingTrigger(60, 2);
+			_scene->_sequences.addTimer(60, 2);
 			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 4);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true);
@@ -3638,7 +3638,7 @@ void Scene105::enter() {
 			_globals[kPanelIn206] && _globals[kDoneRichConv203] && _game._objects.isInInventory(OBJ_LANTERN) &&
 			((_game._objects.isInInventory(OBJ_CABLE_HOOK) && _game._objects.isInInventory(OBJ_ROPE)) || _game._objects.isInInventory(OBJ_ROPE_WITH_HOOK))) {
 			_globals[kHintThatDaaeIsHome2] = true;
-			_scene->_sequences.setTimingTrigger(300, 75);
+			_scene->_sequences.addTimer(300, 75);
 		}
 	}
 
@@ -3728,7 +3728,7 @@ void Scene105::step() {
 
 	case 75:
 		_scene->playSpeech(8);
-		_scene->_sequences.setTimingTrigger(120, 76);
+		_scene->_sequences.addTimer(120, 76);
 		break;
 
 	case 76:
@@ -3846,7 +3846,7 @@ void Scene105::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
@@ -3885,7 +3885,7 @@ void Scene105::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
@@ -3916,7 +3916,7 @@ void Scene105::actions() {
 
 			case 2:
 				_game._player._visible = true;
-				_scene->_sequences.setTimingTrigger(180, 3);
+				_scene->_sequences.addTimer(180, 3);
 				break;
 
 			case 3:
@@ -3962,7 +3962,7 @@ void Scene105::actions() {
 				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false);
 				_vm->_sound->command(73);
-				_scene->_sequences.setTimingTrigger(15, 2);
+				_scene->_sequences.addTimer(15, 2);
 				}
 				break;
 
@@ -4216,7 +4216,7 @@ void Scene106::enter() {
 		 && ((_game._objects.isInInventory(OBJ_CABLE_HOOK) && _game._objects.isInInventory(OBJ_ROPE))
 		   || _game._objects.isInInventory(OBJ_ROPE_WITH_HOOK))) {
 			_globals[kHintThatDaaeIsHome1] = true;
-			_scene->_sequences.setTimingTrigger(300, 85);
+			_scene->_sequences.addTimer(300, 85);
 		}
 	}
 
@@ -4294,7 +4294,7 @@ void Scene106::step() {
 	switch (_game._trigger) {
 	case 85:
 		_scene->playSpeech(8);
-		_scene->_sequences.setTimingTrigger(120, 86);
+		_scene->_sequences.addTimer(120, 86);
 		break;
 
 	case 86:
@@ -4348,7 +4348,7 @@ void Scene106::actions() {
 			case 2:
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
 				_game._player._visible = true;
-				_scene->_sequences.setTimingTrigger(20, 3);
+				_scene->_sequences.addTimer(20, 3);
 				break;
 
 			case 3:
@@ -4388,7 +4388,7 @@ void Scene106::actions() {
 			case 2:
 				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
 				_game._player._visible = true;
-				_scene->_sequences.setTimingTrigger(20, 3);
+				_scene->_sequences.addTimer(20, 3);
 				break;
 
 			case 3:
@@ -4428,7 +4428,7 @@ void Scene106::actions() {
 		return;
 
 	case 81:
-		_scene->_sequences.setTimingTrigger(120, 82);
+		_scene->_sequences.addTimer(120, 82);
 		_action._inProgress = false;
 		return;
 
@@ -4478,7 +4478,7 @@ void Scene106::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 9);
-				_scene->_sequences.setTimingTrigger(6, 2);
+				_scene->_sequences.addTimer(6, 2);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				break;
 
@@ -4846,7 +4846,7 @@ void Scene107::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
@@ -5642,7 +5642,7 @@ void Scene109::enter() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
 		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
-		_scene->_sequences.setTimingTrigger(1, 70);
+		_scene->_sequences.addTimer(1, 70);
 	} else {
 		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 0), false);
 		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 1), false);
@@ -5775,7 +5775,7 @@ void Scene109::step() {
 		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, rndFrame);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
 
-		_scene->_sequences.setTimingTrigger(rndDelay, 70);
+		_scene->_sequences.addTimer(rndDelay, 70);
 	}
 }
 
@@ -5960,7 +5960,7 @@ void Scene109::actions() {
 			else if (_currentFloor == 2)
 				_game._player.walk(Common::Point(2, 281), FACING_WEST);
 
-			_scene->_sequences.setTimingTrigger(180, 3);
+			_scene->_sequences.addTimer(180, 3);
 			break;
 
 		case 3:
@@ -6184,7 +6184,7 @@ void Scene110::actions() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4);
 			_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
-			_scene->_sequences.setTimingTrigger(30, 2);
+			_scene->_sequences.addTimer(30, 2);
 			_vm->_sound->command(73);
 			}
 			break;
@@ -6234,7 +6234,7 @@ void Scene110::actions() {
 				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4);
 				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
-				_scene->_sequences.setTimingTrigger(30, 2);
+				_scene->_sequences.addTimer(30, 2);
 				_vm->_sound->command(73);
 				}
 				break;
@@ -6625,7 +6625,7 @@ void Scene111::step() {
 		_game._player._visible = true;
 		_anim0ActvFl = false;
 		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
-		_scene->_sequences.setTimingTrigger(30, 71);
+		_scene->_sequences.addTimer(30, 71);
 		break;
 
 	case 71:
@@ -6661,7 +6661,7 @@ void Scene111::actions() {
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4);
 			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
-			_scene->_sequences.setTimingTrigger(30, 2);
+			_scene->_sequences.addTimer(30, 2);
 			_vm->_sound->command(73);
 			_action._inProgress = false;
 			return;
@@ -6711,7 +6711,7 @@ void Scene111::actions() {
 				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4);
 				_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
-				_scene->_sequences.setTimingTrigger(30, 2);
+				_scene->_sequences.addTimer(30, 2);
 				_vm->_sound->command(73);
 				_action._inProgress = false;
 				return;
@@ -7342,7 +7342,7 @@ void Scene112::handleConversation() {
 		break;
 
 	case 68:
-		_scene->_sequences.setTimingTrigger(120, 70);
+		_scene->_sequences.addTimer(120, 70);
 		_vm->_gameConv->hold();
 		break;
 
@@ -7962,7 +7962,7 @@ void Scene113::enter() {
 
 		_scene->_hotspots.activate(NOUN_CHRISTINE, true);
 		_scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(220, 130));
-		_scene->_sequences.setTimingTrigger(60, 60);
+		_scene->_sequences.addTimer(60, 60);
 		_game._player._playerPos = Common::Point(190, 148);
 		_game._player._facing = FACING_NORTH;
 	} else if ((_globals[kCurrentYear] == 1881) && _globals[kChrisKickedRaoulOut]) {
@@ -7972,7 +7972,7 @@ void Scene113::enter() {
 		_globals[kCameFromFade] = true;
 		_game._player._stepEnabled = false;
 		_globals[kPlayerScore] += 8;
-		_scene->_sequences.setTimingTrigger(60, 110);
+		_scene->_sequences.addTimer(60, 110);
 	} else if (_scene->_priorSceneId == 111) {
 		_game._player._playerPos = Common::Point(190, 148);
 		_game._player._facing = FACING_NORTH;
@@ -8894,7 +8894,7 @@ void Scene113::handleFlorentConversation() {
 
 	case 26:
 		if (!_prevent2) {
-			_scene->_sequences.setTimingTrigger(120, 92);
+			_scene->_sequences.addTimer(120, 92);
 			_vm->_gameConv->setInterlocutorTrigger(96);
 			_florentStatus = 0;
 			_prevent2 = true;
@@ -8953,7 +8953,7 @@ void Scene113::handleFlorentConversation() {
 
 	case 82:
 		_florentStatus = 0;
-		_scene->_sequences.setTimingTrigger(120, 84);
+		_scene->_sequences.addTimer(120, 84);
 		_vm->_gameConv->hold();
 		break;
 
@@ -9020,7 +9020,7 @@ void Scene113::handleLoveConversation() {
 	case 21:
 		if (!_armsOutFl) {
 			_dayStatus = 4;
-			_scene->_sequences.setTimingTrigger(1, 70);
+			_scene->_sequences.addTimer(1, 70);
 			_scene->_userInterface.emptyConversationList();
 			_scene->_userInterface.setup(kInputConversation);
 			_scene->_hotspots.activate(NOUN_CHRISTINE, false);
@@ -9092,12 +9092,12 @@ void Scene113::handleLoveConversation() {
 		if (_afterKissFl)
 			_vm->_gameConv->release();
 		else
-			_scene->_sequences.setTimingTrigger(1, 72);
+			_scene->_sequences.addTimer(1, 72);
 		break;
 
 	case 76:
 		_vm->_gameConv->hold();
-		_scene->_sequences.setTimingTrigger(1, 72);
+		_scene->_sequences.addTimer(1, 72);
 		break;
 
 	case 78:
@@ -9116,7 +9116,7 @@ void Scene113::handleLoveConversation() {
 		break;
 
 	case 82:
-		_scene->_sequences.setTimingTrigger(120, 84);
+		_scene->_sequences.addTimer(120, 84);
 		_vm->_gameConv->hold();
 		_dayStatus = 1;
 		_dayWantsToTalk = true;
@@ -9249,7 +9249,7 @@ void Scene114::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 0ae990a..5d0c3fa 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -2080,7 +2080,7 @@ void Scene203::handleBrieConversation() {
 			else
 				_scene->playSpeech(1);
 
-			_scene->_sequences.setTimingTrigger(60, 110);
+			_scene->_sequences.addTimer(60, 110);
 		}
 		break;
 
@@ -3185,7 +3185,7 @@ void Scene203::handleDaaeAnimation() {
 		break;
 
 	case 201:
-		_scene->_sequences.setTimingTrigger(1, 95);
+		_scene->_sequences.addTimer(1, 95);
 		break;
 
 	case 76:
@@ -3567,7 +3567,7 @@ void Scene204::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[4]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
@@ -4187,7 +4187,7 @@ void Scene204::handleEndAnimation() {
 	}
 
 	if ((_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 26) && !_skip2Fl) {
-		_scene->_sequences.setTimingTrigger(300, 85);
+		_scene->_sequences.addTimer(300, 85);
 		_scene->_kernelMessages.add(Common::Point(123, 137), 0x1110, 0, 0, 360, _game.getQuote(0x75));
 		_skip2Fl = true;
 	}
@@ -4601,7 +4601,7 @@ void Scene205::actions() {
 				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
 				_vm->_sound->command(72);
-				_scene->_sequences.setTimingTrigger(15, 2);
+				_scene->_sequences.addTimer(15, 2);
 				_action._inProgress = false;
 				return;
 				}
@@ -5953,7 +5953,7 @@ void Scene206::step() {
 		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 118) {
 			_globals[kKnockedOverHead] = true;
 			_skip1Fl = true;
-			_scene->_sequences.setTimingTrigger(1, 84);
+			_scene->_sequences.addTimer(1, 84);
 		}
 	}
 
@@ -6031,7 +6031,7 @@ void Scene206::actions() {
 		case 78:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 79);
+			_scene->_sequences.addTimer(20, 79);
 			_action._inProgress = false;
 			return;
 
@@ -6144,7 +6144,7 @@ void Scene206::actions() {
 				_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], true, -2);
 				_game.syncTimers(1, _globals._sequenceIndexes[5], 1, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], false);
-				_scene->_sequences.setTimingTrigger(30, 65);
+				_scene->_sequences.addTimer(30, 65);
 				}
 				break;
 
@@ -6307,7 +6307,7 @@ void Scene206::actions() {
 			_globals[kPlayerScoreFlags] |= 8;
 			_globals[kPlayerScore] += 5;
 		}
-		_scene->_sequences.setTimingTrigger(15, 96);
+		_scene->_sequences.addTimer(15, 96);
 
 		_action._inProgress = false;
 		return;
@@ -6405,8 +6405,8 @@ void Scene207::actions() {
 		case 1:
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
-			_scene->_sequences.setTimingTrigger(120, 2);
-			_scene->_sequences.setTimingTrigger(240, 3);
+			_scene->_sequences.addTimer(120, 2);
+			_scene->_sequences.addTimer(240, 3);
 			break;
 
 		case 2:
@@ -6589,43 +6589,43 @@ void Scene208::enter() {
 	_topLeftPeopleFrame = 2;
 	_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, _topLeftPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
-	_scene->_sequences.setTimingTrigger(120, 60);
+	_scene->_sequences.addTimer(120, 60);
 
 	_topRightPeopleFrame = 2;
 	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, _topRightPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
-	_scene->_sequences.setTimingTrigger(30, 62);
+	_scene->_sequences.addTimer(30, 62);
 
 	_middleLeftPeopleFrame = 2;
 	_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, _middleLeftPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-	_scene->_sequences.setTimingTrigger(30, 64);
+	_scene->_sequences.addTimer(30, 64);
 
 	_centerPeopleFrame = 1;
 	_direction = 1;
 	_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, _centerPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
-	_scene->_sequences.setTimingTrigger(300, 66);
+	_scene->_sequences.addTimer(300, 66);
 
 	_middleRightPeopleFrame = 3;
 	_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, _middleRightPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
-	_scene->_sequences.setTimingTrigger(60, 68);
+	_scene->_sequences.addTimer(60, 68);
 
 	_bottomLeftPeopleFrame = 4;
 	_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, _bottomLeftPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
-	_scene->_sequences.setTimingTrigger(60, 70);
+	_scene->_sequences.addTimer(60, 70);
 
 	_bottomMiddlePeopleFrame = 4;
 	_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, _bottomMiddlePeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
-	_scene->_sequences.setTimingTrigger(30, 72);
+	_scene->_sequences.addTimer(30, 72);
 
 	_bottomRightPeopleFrame = 3;
 	_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, _bottomRightPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
-	_scene->_sequences.setTimingTrigger(15, 74);
+	_scene->_sequences.addTimer(15, 74);
 
 	_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('p', 1), 80);
 
@@ -6699,7 +6699,7 @@ void Scene208::animateTopLeftPeople() {
 	_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, _topLeftPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
 	int delay = _vm->getRandomNumber(15, 60);
-	_scene->_sequences.setTimingTrigger(delay, 60);
+	_scene->_sequences.addTimer(delay, 60);
 }
 
 void Scene208::animateTopRightPeople() {
@@ -6726,7 +6726,7 @@ void Scene208::animateTopRightPeople() {
 	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, _topRightPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 	int delay = _vm->getRandomNumber(15, 60);
-	_scene->_sequences.setTimingTrigger(delay, 62);
+	_scene->_sequences.addTimer(delay, 62);
 }
 
 void Scene208::animateMiddleLeftPeople() {
@@ -6758,7 +6758,7 @@ void Scene208::animateMiddleLeftPeople() {
 
 	_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, _middleLeftPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
-	_scene->_sequences.setTimingTrigger(delay, 64);
+	_scene->_sequences.addTimer(delay, 64);
 }
 
 
@@ -6790,7 +6790,7 @@ void Scene208::animateCenterPeople() {
 
 	_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, _centerPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
-	_scene->_sequences.setTimingTrigger(delay, 66);
+	_scene->_sequences.addTimer(delay, 66);
 }
 
 void Scene208::animateMiddleRightPeople() {
@@ -6820,7 +6820,7 @@ void Scene208::animateMiddleRightPeople() {
 	_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, _middleRightPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
 	int delay = _vm->getRandomNumber(15, 60);
-	_scene->_sequences.setTimingTrigger(delay, 68);
+	_scene->_sequences.addTimer(delay, 68);
 }
 
 void Scene208::animateBottomLeftPeople() {
@@ -6847,7 +6847,7 @@ void Scene208::animateBottomLeftPeople() {
 	_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, _bottomLeftPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
 	int delay = _vm->getRandomNumber(15, 60);
-	_scene->_sequences.setTimingTrigger(delay, 70);
+	_scene->_sequences.addTimer(delay, 70);
 }
 
 void Scene208::animateBottomMiddlePeople() {
@@ -6874,7 +6874,7 @@ void Scene208::animateBottomMiddlePeople() {
 	_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, _bottomMiddlePeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
 	int delay = _vm->getRandomNumber(15, 60);
-	_scene->_sequences.setTimingTrigger(delay, 72);
+	_scene->_sequences.addTimer(delay, 72);
 }
 
 void Scene208::animateBottomRightPeople() {
@@ -6901,7 +6901,7 @@ void Scene208::animateBottomRightPeople() {
 	_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, _bottomRightPeopleFrame);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
 	int delay = _vm->getRandomNumber(15, 60);
-	_scene->_sequences.setTimingTrigger(delay, 74);
+	_scene->_sequences.addTimer(delay, 74);
 }
 
 /*------------------------------------------------------------------------*/
@@ -6930,7 +6930,7 @@ void Scene250::enter() {
 
 void Scene250::step() {
 	if (_game._trigger == 1)
-		_scene->_sequences.setTimingTrigger(12, 2);
+		_scene->_sequences.addTimer(12, 2);
 
 	if (_game._trigger == 2) {
 		int y = 68;
@@ -6982,7 +6982,7 @@ void Scene250::step() {
 			messageId = 0x41;
 
 		_scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 0, 900, _game.getQuote(messageId));
-		_scene->_sequences.setTimingTrigger(930, 3);
+		_scene->_sequences.addTimer(930, 3);
 	}
 
 	if (_game._trigger == 3)
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 4ce543f..33a30a8 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -217,7 +217,7 @@ void Scene301::step() {
 			_scene->setAnimFrame(_globals._animationIndexes[0], 60);
 			if (!_skip2Fl) {
 				_vm->_sound->command(1);
-				_scene->_sequences.setTimingTrigger(420, 70);
+				_scene->_sequences.addTimer(420, 70);
 				_skip2Fl = true;
 			}
 		}
@@ -231,7 +231,7 @@ void Scene301::step() {
 	}
 
 	if (_game._trigger == 64)
-		_scene->_sequences.setTimingTrigger(60, 65);
+		_scene->_sequences.addTimer(60, 65);
 
 	if (_game._trigger == 65)
 		_vm->_dialogs->show(30137);
@@ -529,7 +529,7 @@ void Scene302::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
@@ -766,7 +766,7 @@ void Scene303::actions() {
 			_anim0ActvFl = false;
 			_game._player._visible = true;
 			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
-			_scene->_sequences.setTimingTrigger(20, 2);
+			_scene->_sequences.addTimer(20, 2);
 			break;
 
 		case 2:
@@ -1558,9 +1558,9 @@ void Scene306::enter() {
 void Scene306::step() {
 	if (_game._trigger == 60) {
 		if (_vm->_sound->_preferRoland)
-			_scene->_sequences.setTimingTrigger(120, 61);
+			_scene->_sequences.addTimer(120, 61);
 		else
-			_scene->_sequences.setTimingTrigger(300, 61);
+			_scene->_sequences.addTimer(300, 61);
 	}
 
 	if (!_speechDoneFl && (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 3)) {
@@ -1571,7 +1571,7 @@ void Scene306::step() {
 	if (_game._trigger == 61) {
 		_vm->_sound->command(1);
 		_vm->_sound->command(66);
-		_scene->_sequences.setTimingTrigger(120, 62);
+		_scene->_sequences.addTimer(120, 62);
 	}
 
 	if (_game._trigger == 62)
@@ -1689,7 +1689,7 @@ void Scene307::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
@@ -1733,7 +1733,7 @@ void Scene307::actions() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
 			_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
-			_scene->_sequences.setTimingTrigger(10, 73);
+			_scene->_sequences.addTimer(10, 73);
 			 }
 			 break;
 
@@ -1979,7 +1979,7 @@ void Scene308::enter() {
 
 	if (!_game._visitedScenes._sceneRevisited) {
 		_globals[kPlayerScore] += 5;
-		_scene->_sequences.setTimingTrigger(1, 60);
+		_scene->_sequences.addTimer(1, 60);
 	}
 
 	sceneEntrySound();
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 997eae3..3e7c1e7 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -722,7 +722,7 @@ void Scene403::enter() {
 	}
 
 	if ((_game._difficulty == DIFFICULTY_EASY) && (_globals[kCatacombsRoom] == 19))
-		_scene->_sequences.setTimingTrigger(120, 60);
+		_scene->_sequences.addTimer(120, 60);
 
 	sceneEntrySound();
 }
@@ -1227,7 +1227,7 @@ void Scene404::enter() {
 	}
 
 	if (_globals[kPriestPistonPuke])
-		_scene->_sequences.setTimingTrigger(120, 60);
+		_scene->_sequences.addTimer(120, 60);
 
 	sceneEntrySound();
 }
@@ -1887,7 +1887,7 @@ void Scene406::actions() {
 		case 2:
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], true, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-			_scene->_sequences.setTimingTrigger(30, 3);
+			_scene->_sequences.addTimer(30, 3);
 			break;
 
 		case 3:
@@ -1901,7 +1901,7 @@ void Scene406::actions() {
 		case 4:
 			_game._player._visible = true;
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
-			_scene->_sequences.setTimingTrigger(6, 5);
+			_scene->_sequences.addTimer(6, 5);
 			break;
 
 		case 5:
@@ -2575,7 +2575,7 @@ void Scene408::enter() {
 	}
 
 	if ((_game._difficulty == DIFFICULTY_HARD) && (_globals[kCatacombsRoom] == 52))
-		_scene->_sequences.setTimingTrigger(120, 60);
+		_scene->_sequences.addTimer(120, 60);
 
 	sceneEntrySound();
 }
@@ -3057,7 +3057,7 @@ void Scene409::step() {
 	if (_game._trigger == 61) {
 		_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, -2);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
-		_scene->_sequences.setTimingTrigger(60, 62);
+		_scene->_sequences.addTimer(60, 62);
 		_vm->_sound->command(27);
 	}
 
@@ -3091,7 +3091,7 @@ void Scene409::actions() {
 			_globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, 4);
 			_game.syncTimers(1, _globals._sequenceIndexes[8], 1, syncIdx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], false);
-			_scene->_sequences.setTimingTrigger(30, 2);
+			_scene->_sequences.addTimer(30, 2);
 			_action._inProgress = false;
 			}
 			return;
@@ -3297,7 +3297,7 @@ void Scene409::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
@@ -3419,7 +3419,7 @@ void Scene409::actions() {
 		case 2:
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
-			_scene->_sequences.setTimingTrigger(30, 3);
+			_scene->_sequences.addTimer(30, 3);
 			break;
 
 		case 3:
@@ -3433,7 +3433,7 @@ void Scene409::actions() {
 		case 4:
 			_game._player._visible = true;
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
-			_scene->_sequences.setTimingTrigger(6, 5);
+			_scene->_sequences.addTimer(6, 5);
 			break;
 
 		case 5:
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 2468de0..9a5b8e4 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -237,7 +237,7 @@ void Scene501::step() {
 
 		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 28) && !_skipFl) {
 			_skipFl = true;
-			_scene->_sequences.setTimingTrigger(1, 55);
+			_scene->_sequences.addTimer(1, 55);
 		}
 
 		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 124) {
@@ -302,7 +302,7 @@ void Scene501::actions() {
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
 			_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
-			_scene->_sequences.setTimingTrigger(15, 2);
+			_scene->_sequences.addTimer(15, 2);
 			_vm->_sound->command(74);
 			}
 			break;
@@ -347,7 +347,7 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
 					_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
-					_scene->_sequences.setTimingTrigger(15, 2);
+					_scene->_sequences.addTimer(15, 2);
 					_vm->_sound->command(74);
 					}
 					break;
@@ -472,7 +472,7 @@ void Scene501::actions() {
 					_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
 					_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
-					_scene->_sequences.setTimingTrigger(15, 2);
+					_scene->_sequences.addTimer(15, 2);
 					_vm->_sound->command(73);
 						}
 						break;
@@ -616,12 +616,12 @@ void Scene501::preActions() {
 			_game._player._stepEnabled = false;
 			_vm->_gameConv->run(26);
 			_vm->_gameConv->exportValue(2);
-			_scene->_sequences.setTimingTrigger(6, 1);
+			_scene->_sequences.addTimer(6, 1);
 			break;
 
 		case 1:
 			if (_vm->_gameConv->_running >= 0)
-				_scene->_sequences.setTimingTrigger(6, 1);
+				_scene->_sequences.addTimer(6, 1);
 			else {
 				_game._player._stepEnabled = true;
 				_action._inProgress = true;
@@ -862,7 +862,7 @@ void Scene502::step() {
 		_scene->_userInterface.noInventoryAnim();
 		// CHECKME: Not sure about the next function call
 		_scene->_userInterface.refresh();
-		_scene->_sequences.setTimingTrigger(120, 76);
+		_scene->_sequences.addTimer(120, 76);
 		break;
 
 	case 73:
@@ -942,7 +942,7 @@ void Scene502::actions() {
 		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
-		_scene->_sequences.setTimingTrigger(5, 102);
+		_scene->_sequences.addTimer(5, 102);
 		_action._inProgress = false;
 		return;
 
@@ -962,7 +962,7 @@ void Scene502::actions() {
 		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
-		_scene->_sequences.setTimingTrigger(5, 102);
+		_scene->_sequences.addTimer(5, 102);
 		_action._inProgress = false;
 		return;
 
@@ -981,7 +981,7 @@ void Scene502::actions() {
 	case 101:
 		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
 		_game._player._visible = true;
-		_scene->_sequences.setTimingTrigger(5, 102);
+		_scene->_sequences.addTimer(5, 102);
 		_action._inProgress = false;
 		return;
 
@@ -1006,7 +1006,7 @@ void Scene502::actions() {
 	case 106:
 		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
 		_game._player._visible = true;
-		_scene->_sequences.setTimingTrigger(5, 102);
+		_scene->_sequences.addTimer(5, 102);
 		_action._inProgress = false;
 		return;
 
@@ -1029,25 +1029,25 @@ void Scene502::actions() {
 		case 1:
 		case 2:
 		case 3:
-			_scene->_sequences.setTimingTrigger(1, 90);
+			_scene->_sequences.addTimer(1, 90);
 			break;
 
 		case 4:
 		case 5:
 		case 6:
 		case 7:
-			_scene->_sequences.setTimingTrigger(1, 95);
+			_scene->_sequences.addTimer(1, 95);
 			break;
 
 		case 8:
 		case 9:
 		case 10:
 		case 11:
-			_scene->_sequences.setTimingTrigger(1, 100);
+			_scene->_sequences.addTimer(1, 100);
 			break;
 
 		default:
-			_scene->_sequences.setTimingTrigger(1, 105);
+			_scene->_sequences.addTimer(1, 105);
 			break;
 		}
 		_action._inProgress = false;
@@ -1319,28 +1319,28 @@ void Scene502::animateFireBursts() {
 		switch (rndTrigger) {
 		case 1:
 			if (!_fire1ActiveFl) {
-				_scene->_sequences.setTimingTrigger(_vm->getRandomNumber(300, 600), 60);
+				_scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 60);
 				_fire1ActiveFl = true;
 			}
 			break;
 
 		case 2:
 			if (!_fire2ActiveFl) {
-				_scene->_sequences.setTimingTrigger(_vm->getRandomNumber(300, 600), 63);
+				_scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 63);
 				_fire2ActiveFl = true;
 			}
 			break;
 
 		case 3:
 			if (!_fire3ActiveFl) {
-				_scene->_sequences.setTimingTrigger(_vm->getRandomNumber(300, 600), 66);
+				_scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 66);
 				_fire3ActiveFl = true;
 			}
 			break;
 
 		case 4:
 			if (!_fire4ActiveFl) {
-				_scene->_sequences.setTimingTrigger(_vm->getRandomNumber(300, 600), 69);
+				_scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 69);
 				_fire4ActiveFl = true;
 			}
 			break;
@@ -1508,7 +1508,7 @@ void Scene502::handlePanelAnimation() {
 		case 3:
 			_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, _puzzleSprites[_panelPushedNum] - 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
-			_scene->_sequences.setTimingTrigger(5, 111);
+			_scene->_sequences.addTimer(5, 111);
 			break;
 
 		case 4:
@@ -1517,7 +1517,7 @@ void Scene502::handlePanelAnimation() {
 		case 7:
 			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, _puzzleSprites[_panelPushedNum] - 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
-			_scene->_sequences.setTimingTrigger(5, 111);
+			_scene->_sequences.addTimer(5, 111);
 			break;
 
 		case 8:
@@ -1526,13 +1526,13 @@ void Scene502::handlePanelAnimation() {
 		case 11:
 			_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, _puzzleSprites[_panelPushedNum] - 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14);
-			_scene->_sequences.setTimingTrigger(5, 111);
+			_scene->_sequences.addTimer(5, 111);
 			break;
 
 		default:
 			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, _puzzleSprites[_panelPushedNum] - 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14);
-			_scene->_sequences.setTimingTrigger(5, 111);
+			_scene->_sequences.addTimer(5, 111);
 			break;
 		}
 		break;
@@ -1615,7 +1615,7 @@ void Scene502::handlePanelAnimation() {
 			_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, newSprId);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
 			_game.syncTimers(1, _globals._sequenceIndexes[11], 1, idx);
-			_scene->_sequences.setTimingTrigger(5, 113);
+			_scene->_sequences.addTimer(5, 113);
 			break;
 
 		case 4:
@@ -1625,7 +1625,7 @@ void Scene502::handlePanelAnimation() {
 			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, newSprId);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
 			_game.syncTimers(1, _globals._sequenceIndexes[12], 1, idx);
-			_scene->_sequences.setTimingTrigger(5, 113);
+			_scene->_sequences.addTimer(5, 113);
 			break;
 
 		case 8:
@@ -1635,14 +1635,14 @@ void Scene502::handlePanelAnimation() {
 			_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, newSprId);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14);
 			_game.syncTimers(1, _globals._sequenceIndexes[13], 1, idx);
-			_scene->_sequences.setTimingTrigger(5, 113);
+			_scene->_sequences.addTimer(5, 113);
 			break;
 
 		default:
 			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, newSprId);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14);
 			_game.syncTimers(1, _globals._sequenceIndexes[14], 1, idx);
-			_scene->_sequences.setTimingTrigger(5, 113);
+			_scene->_sequences.addTimer(5, 113);
 			break;
 		}
 		}
@@ -2117,7 +2117,7 @@ void Scene504::enter() {
 			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 			if (!_globals[kHeListened])
-				_scene->_sequences.setTimingTrigger(30, 62);
+				_scene->_sequences.addTimer(30, 62);
 		}
 	}
 
@@ -2155,12 +2155,12 @@ void Scene504::step() {
 		_game._player._visible = true;
 		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
-		_scene->_sequences.setTimingTrigger(30, 61);
+		_scene->_sequences.addTimer(30, 61);
 	}
 
 	if (_game._trigger == 61) {
 		_game._player._stepEnabled = true;
-		_scene->_sequences.setTimingTrigger(60, 62);
+		_scene->_sequences.addTimer(60, 62);
 	}
 
 	if (_game._trigger == 62) {
@@ -2253,7 +2253,7 @@ void Scene504::step() {
 		_game._player._visible = true;
 		_anim1ActvFl = false;
 		_game._player.resetFacing(FACING_EAST);
-		_scene->_sequences.setTimingTrigger(10, 101);
+		_scene->_sequences.addTimer(10, 101);
 	}
 
 	if (_game._trigger == 101) {
@@ -2329,7 +2329,7 @@ void Scene504::actions() {
 		_game._player._visible = true;
 		_anim1ActvFl = false;
 		_game._player.resetFacing(FACING_EAST);
-		_scene->_sequences.setTimingTrigger(10, 101);
+		_scene->_sequences.addTimer(10, 101);
 		_action._inProgress = false;
 		return;
 	}
@@ -2419,7 +2419,7 @@ void Scene504::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[14]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			_action._inProgress = false;
 			return;
 			break;
@@ -2577,12 +2577,12 @@ void Scene504::preActions() {
 					_game._player._stepEnabled = false;
 					_vm->_gameConv->run(26);
 					_vm->_gameConv->exportValue(2);
-					_scene->_sequences.setTimingTrigger(6, 1);
+					_scene->_sequences.addTimer(6, 1);
 					break;
 
 				case 1:
 					if (_vm->_gameConv->_running >= 0)
-						_scene->_sequences.setTimingTrigger(6, 1);
+						_scene->_sequences.addTimer(6, 1);
 					else {
 						_game._player._stepEnabled = true;
 						_action._inProgress = true;
@@ -2722,7 +2722,7 @@ void Scene504::handleOrganAnimation() {
 			resetFrame = 25;
 			++_playCount;
 			if (!_globals[kRightDoorIsOpen504]) {
-				_scene->_sequences.setTimingTrigger(1, 80);
+				_scene->_sequences.addTimer(1, 80);
 				_globals[kPlayerScore] += 5;
 			}
 		}
@@ -3648,7 +3648,7 @@ void Scene505::handleCoffinDialog() {
 	case 75:
 		_game._player._visible = true;
 		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
-		_scene->_sequences.setTimingTrigger(10, 76);
+		_scene->_sequences.addTimer(10, 76);
 		break;
 
 	case 85:
@@ -4117,7 +4117,7 @@ void Scene506::actions() {
 		case 2:
 			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[4]);
 			_game._player._visible = true;
-			_scene->_sequences.setTimingTrigger(20, 3);
+			_scene->_sequences.addTimer(20, 3);
 			break;
 
 		case 3:
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index acfb6fa..479a042 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -561,11 +561,6 @@ int SequenceList::addStampCycle(int srcSpriteIdx, bool flipped, int sprite) {
 	return (id);
 }
 
-int SequenceList::setTimingTrigger(int delay, int code) {
-	warning("TODO: SequenceList::setTimingTrigger");
-	return -1;
-}
-
 void SequenceList::setSeqPlayer(int idx, bool flag) {
 	Player &player = _vm->_game->_player;
 	int yp = player._playerPos.y + (player._centerOfGravity * player._currentScale) / 100;
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
index 67b9ba7..05a7b61 100644
--- a/engines/mads/sequence.h
+++ b/engines/mads/sequence.h
@@ -127,7 +127,6 @@ public:
 	void setMotion(int seqIndex, int flags, int deltaX, int deltaY);
 
 	int addStampCycle(int srcSpriteIdx, bool flipped, int sprite);
-	int setTimingTrigger(int delay, int code);
 	void setSeqPlayer(int idx, bool flag);
 };
 


Commit: 6a34a1d58f1936e139f58c8f1ec99a36445e2aa9
    https://github.com/scummvm/scummvm/commit/6a34a1d58f1936e139f58c8f1ec99a36445e2aa9
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-10T09:21:19+01:00

Commit Message:
MADS: Phantom: Add a comment about changing section

Changed paths:
    engines/mads/phantom/phantom_scenes.cpp



diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
index 344601f..f7a7153 100644
--- a/engines/mads/phantom/phantom_scenes.cpp
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -41,6 +41,7 @@ namespace Phantom {
 SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	Scene &scene = vm->_game->_scene;
 
+	// When changing from one section to the other, set the scaling velocity
 	if ((scene._nextSceneId / 100) != (scene._priorSceneId / 100))
 		vm->_game->_player._scalingVelocity = true;
 


Commit: 1765e231d9e2b176fa986c2fd3f16e50dbbaec9c
    https://github.com/scummvm/scummvm/commit/1765e231d9e2b176fa986c2fd3f16e50dbbaec9c
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-11-10T11:55:50+02:00

Commit Message:
MADS: Phantom: Implement disableNode() and disableLine()

Changed paths:
    engines/mads/rails.cpp



diff --git a/engines/mads/rails.cpp b/engines/mads/rails.cpp
index 0c946cf..ee0ca98 100644
--- a/engines/mads/rails.cpp
+++ b/engines/mads/rails.cpp
@@ -274,12 +274,18 @@ void Rails::synchronize(Common::Serializer &s) {
 	}
 }
 
-void Rails::disableNode(int idx) {
-	warning("TODO: Rails::disableNode");
+void Rails::disableNode(int nodeIndex) {
+	_nodes[nodeIndex]._active = false;
+
+	for (uint16 i = 0; i < _nodes.size(); i++) {
+		if (i != nodeIndex)
+			disableLine(i, nodeIndex);
+	}
 }
 
 void Rails::disableLine(int from, int to) {
-	warning("TODO: Rails::disableLine");
+	_nodes[from]._distances[to] = 0x3FFF;
+	_nodes[to]._distances[from] = 0x3FFF;
 }
 
 } // End of namespace MADS


Commit: bbe61b405406e7f257662b2244fd73e9f683dc6c
    https://github.com/scummvm/scummvm/commit/bbe61b405406e7f257662b2244fd73e9f683dc6c
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-11T00:10:41+01:00

Commit Message:
MADS: DRAGON: Use constants instead of hardcoded values in one call of addSprites

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index ee15af1..a4c89d6 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -2200,7 +2200,7 @@ void Scene104::actions() {
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6);
 			_game.syncTimers(1, _globals._sequenceIndexes[14], 4, 0);
 
-			_globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('e', 3), 0x1000 | 0x2000);
+			_globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('e', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 2), 0);
 			_anim1ActvFl = false;
 			_anim5ActvFl = true;


Commit: 0f5130e491b4a1d0d58b712971524ee368c1de21
    https://github.com/scummvm/scummvm/commit/0f5130e491b4a1d0d58b712971524ee368c1de21
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-11T00:35:26+01:00

Commit Message:
MADS: For consistency with Rex, remove the second parameter of addSprites when its value is the default one

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes5.cpp



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index a4c89d6..ed446c4 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -226,7 +226,7 @@ void Scene101::step() {
 
 void Scene101::actions() {
 	if (_action.isObject(NOUN_BED)) {
-		int sprIdx = _scene->_sprites.addSprites("*ob001i", false);
+		int sprIdx = _scene->_sprites.addSprites("*ob001i");
 		int seqIdx = _scene->_sequences.addStampCycle(sprIdx, false, 1);
 		_scene->_sequences.setDepth(seqIdx, 0);
 		_scene->_sequences.setPosition(seqIdx, Common::Point(10, 50));
@@ -264,13 +264,13 @@ void Scene102::setup() {
 }
 
 void Scene102::enter() {
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 1), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 0), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 1), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', -1), false);
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6", false);
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 0));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 1));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', -1));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6");
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2));
 
 	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0);
 	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0);
@@ -678,17 +678,17 @@ void Scene103::setup() {
 void Scene103::enter() {
 	_vm->_disableFastwalk = true;
 
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('y', 1), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('y', 2), false);
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 7), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('y', 0), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 3), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 4), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('y', 5), false);
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('y', 6), false);
-	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[11] = _scene->_sprites.addSprites("*KGRD_9", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('y', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('y', 2));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 7));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('y', 0));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 3));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 4));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('y', 5));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('y', 6));
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites("*KGRD_9");
 
 	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 0);
 	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0, 4);
@@ -1152,8 +1152,8 @@ void Scene104::enter() {
 	_vm->_gameConv->get(1);
 
 	if (_globals[kPlayerPersona] == 1) {
-		_scene->_sprites.addSprites(formAnimName('e', 8), false);
-		_scene->_sprites.addSprites(formAnimName('b', 5), false);
+		_scene->_sprites.addSprites(formAnimName('e', 8));
+		_scene->_sprites.addSprites(formAnimName('b', 5));
 	}
 
 	_scene->_hotspots.activate(NOUN_MACMORN, false);
@@ -1180,13 +1180,13 @@ void Scene104::enter() {
 
 	_anim6ActvFl = false;
 
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 4));
 
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
 	if (_globals[kNoLoadWalker]) {
 		_scene->drawToBackground(_globals._spriteIndexes[6], 5, Common::Point(-32000, -32000), 0, 100);
 		_scene->_sprites.remove(_globals._spriteIndexes[6]);
@@ -1195,11 +1195,11 @@ void Scene104::enter() {
 	if (_globals[kPlayerPersona] == 0) {
 		_scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(139, 132));
 
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_8", false);
-		_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM1_8", false);
-		_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('y', 5), false);
-		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4), false);
-		_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('y', 1), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_8");
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM1_8");
+		_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('y', 5));
+		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4));
+		_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('y', 1));
 
 		if (_globals[kTapestryStatus] == 0 || _globals[kTapestryStatus] == 2) {
 			_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
@@ -1225,19 +1225,19 @@ void Scene104::enter() {
 			}
 		}
 	} else {
-		_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('e', 5), false);
-		_scene->_sprites.addSprites(formAnimName('b', 0), false);
-		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('b', 3), false);
+		_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('e', 5));
+		_scene->_sprites.addSprites(formAnimName('b', 0));
+		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('b', 3));
 		_scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(140, 107));
 		_scene->_hotspots.activateAtPos(NOUN_TABLE, true, Common::Point(139, 132));
-		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4), false);
+		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4));
 
 		if (_globals[kNoLoadWalker]) {
 			_scene->drawToBackground(_globals._spriteIndexes[10], 1, Common::Point(-32000, -32000), 0, 100);
 			_scene->_sprites.remove(_globals._spriteIndexes[10]);
 		}
 
-		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('y', 3), false);
+		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('y', 3));
 		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
 		_doorwayHotspotId = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, SYNTAX_SINGULAR, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index d1d77e3..11cf1c7 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -884,23 +884,23 @@ void Scene103::enter() {
 
 	if (_globals[kJacquesStatus] >= 1) {
 		if (_game._objects.isInRoom(OBJ_KEY)) {
-			_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-			_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false);
+			_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 2));
+			_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9");
 		}
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
-		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 3));
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1));
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('f', 1));
 	} else {
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0));
+		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3));
 	}
 
-	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 2), false);
-	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_6", false);
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 2));
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_6");
 
 	adjustRails(_scene->_initialVariant);
 
@@ -2487,12 +2487,12 @@ void Scene104::enter() {
 		_needToStandUp = false;
 	}
 
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 6), false);
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 6));
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
 
 	if (_globals[kCurrentYear] == 1993)
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 0), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 0));
 
 	_vm->_gameConv->get(7);
 
@@ -3624,14 +3624,14 @@ void Scene105::setup() {
 void Scene105::enter() {
 	_scene->loadSpeech(8);
 
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RDR_9", false);
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RDR_9");
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1));
 	if (_globals[kCurrentYear] == 1993)
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', -1));
 
 	if ((_globals[kCurrentYear] == 1881) && (!_globals[kHintThatDaaeIsHome2])) {
 		if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2) &&
@@ -3643,7 +3643,7 @@ void Scene105::enter() {
 	}
 
 	if ((_game._objects.isInRoom(OBJ_LANTERN)) && (_globals[kCurrentYear] == 1881)) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
 		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 	} else {
@@ -3651,7 +3651,7 @@ void Scene105::enter() {
 	}
 
 	if (_game._objects.isInRoom(OBJ_RED_FRAME)) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 	} else {
@@ -4193,22 +4193,22 @@ void Scene106::enter() {
 
 	if (_globals[kCurrentYear] == 1993) {
 		if (!_game._objects.isInInventory(OBJ_SANDBAG)) {
-			_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9", false);
-			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+			_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9");
+			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
 		}
 	} else {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('z', -1));
 		if (_game._objects.isInRoom(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
-			_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9", false);
-			_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+			_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9");
+			_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('p', 0));
 		}
 	}
 
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDR_9", false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 2), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDR_9");
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 2));
 
 	if ((_globals[kCurrentYear] == 1881) && (!_globals[kHintThatDaaeIsHome1])) {
 		if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2)
@@ -4753,11 +4753,11 @@ void Scene107::setup() {
 
 void Scene107::enter() {
 	if (_globals[kCurrentYear] == 1993)
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
 
 	if (_game._objects.isInRoom(OBJ_YELLOW_FRAME)) {
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0));
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9");
 	}
 
 	if (_game._objects.isInRoom(OBJ_YELLOW_FRAME)) {
@@ -5060,7 +5060,7 @@ void Scene108::enter() {
 	_vm->_gameConv->get(2);
 
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
 		_scene->_hotspots.activate(NOUN_STOOL, false);
 		int idx = _scene->_dynamicHotspots.add(NOUN_STOOL, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(250, 68, 250 + 8, 68 + 21));
 		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
@@ -5626,14 +5626,14 @@ void Scene109::enter() {
 	_anim2ActvFl = false;
 	_anim3ActvFl = false;
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RDR_6", false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RDR_6");
 
 	if (_globals[kCurrentYear] == 1881) {
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4));
 
 		_scene->_hotspots.activate(NOUN_LIGHT_FIXTURE, false);
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
@@ -5644,9 +5644,9 @@ void Scene109::enter() {
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
 		_scene->_sequences.addTimer(1, 70);
 	} else {
-		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 0), false);
-		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 1), false);
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('z', 2), false);
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 0));
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 1));
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('z', 2));
 
 		_scene->_hotspots.activate(NOUN_LAMP, false);
 		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
@@ -6120,12 +6120,12 @@ void Scene110::setup() {
 }
 
 void Scene110::enter() {
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9");
 
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_POSTER, false);
 		_scene->_hotspots.activate(NOUN_WASTE_BASKET, false);
@@ -6507,16 +6507,16 @@ void Scene111::enter() {
 
 	_vm->_gameConv->get(14);
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RDR_9", false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 3), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RDR_9");
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 3));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0));
 
 	if (_globals[kCurrentYear] == 1881)
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 2), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 2));
 
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', -1));
 		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_LAMP, false);
 		int idx = _scene->_dynamicHotspots.add(NOUN_WALL, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 82, 35 + 13, 82 + 11));
@@ -7747,14 +7747,14 @@ void Scene113::enter() {
 	_scene->_hotspots.activate(NOUN_LIGHT_FIXTURE, false);
 
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', -1));
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0));
 
 		if (_game._objects.isInRoom(OBJ_SMALL_NOTE))
-			_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+			_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1));
 
 		if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3))
-			_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 3), false);
+			_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 3));
 	}
 
 	if (_globals[kCurrentYear] == 1993) {
@@ -9160,13 +9160,13 @@ void Scene114::setup() {
 
 void Scene114::enter() {
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
 	} else if (_game._objects.isInRoom(OBJ_ROPE) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9", false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0));
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9");
 	}
 
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
 
 	if ((_game._objects.isInRoom(OBJ_ROPE)) && (_globals[kCurrentYear] == 1881) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 5d0c3fa..b00b0a2 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -114,8 +114,8 @@ void Scene201::enter() {
 	_needHoldFl = false;
 
 	_vm->_gameConv->get(16);
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0));
 
 	if (_globals[kTicketPeoplePresent]) {
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('s', 1), 0);
@@ -654,9 +654,9 @@ void Scene202::enter() {
 	_vm->_gameConv->get(17);
 	_vm->_gameConv->get(9);
 
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9", false);
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9");
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0));
 
 	if (_globals[kTicketPeoplePresent] == 2) {
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 0), 0);
@@ -1556,13 +1556,13 @@ void Scene203::enter() {
 	_scene->_hotspots.activate(NOUN_PARCHMENT, false);
 	_scene->_hotspots.activate(NOUN_NOTICE, false);
 
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 1), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_6", false);
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('p', 0));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_6");
 
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
 		_vm->_gameConv->get(5);
 	} else {
 		_vm->_gameConv->get(8);
@@ -3325,10 +3325,10 @@ void Scene204::enter() {
 	_scene->_hotspots.activate(NOUN_BOOK, false);
 	_vm->_gameConv->get(22);
 
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 6), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RALRH_9", false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RDRR_6", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 6));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RALRH_9");
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RDRR_6");
 
 	if (_game._objects.isInRoom(OBJ_BOOK) || (_globals[kCurrentYear] == 1881) || _endGameFl) {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
@@ -3338,7 +3338,7 @@ void Scene204::enter() {
 	}
 
 	if ((_globals[kCurrentYear] == 1993) || _endGameFl) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_sprites.remove(_globals._spriteIndexes[0]);
 		_scene->_hotspots.activate(NOUN_CANDLE, false);
@@ -3378,10 +3378,10 @@ void Scene204::enter() {
 	}
 
 	if ((_scene->_priorSceneId == 306) || (_endGameFl)) {
-		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('f', 0));
 		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
 	} else if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1));
 		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_sprites.remove(_globals._spriteIndexes[1]);
 	}
@@ -4269,9 +4269,9 @@ void Scene205::enter() {
 	_noConversationHold = false;
 	_giveTicketFl = false;
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_9");
 
 	_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false);
 	_scene->_hotspots.activate(NOUN_MADAME_GIRY, false);
@@ -5866,11 +5866,11 @@ void Scene206::enter() {
 	_scene->loadSpeech(1);
 	_vm->_gameConv->get(26);
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RDR_9");
 
 	if (_scene->_priorSceneId != 308) {
 		if (_globals[kPanelIn206] == 0) {
@@ -5890,7 +5890,7 @@ void Scene206::enter() {
 	}
 
 	if (_game._objects.isInRoom(OBJ_CRUMPLED_NOTE)) {
-		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('p', 0));
 		_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 10);
 	} else
@@ -6360,9 +6360,9 @@ void Scene207::enter() {
 	_skip1Fl = false;
 	_anim0ActvFl = false;
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 
 	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
@@ -6569,14 +6569,14 @@ void Scene208::enter() {
 	_skip1Fl = false;
 	_skip2Fl = false;
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 6), false);
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 7), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 6));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 7));
 
 	_scene->_userInterface.emptyConversationList();
 	_scene->_userInterface.setup(kInputConversation);
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 33a30a8..516376f 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -121,17 +121,17 @@ void Scene301::enter() {
 	_scene->_hotspots.activate(NOUN_CABLE, false);
 	_scene->_hotspots.activate(NOUN_STOOL, false);
 
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0));
 
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', 0), false);
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', 1), false);
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 2), false);
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', 3), false);
-		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('z', 4), false);
-		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 5), false);
-		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 6), false);
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1));
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', 0));
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', 1));
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 2));
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', 3));
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('z', 4));
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 5));
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 6));
 
 		_lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(50, 116, 50 + 19, 116 + 10));
 		_scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(67, 129), FACING_NORTHWEST);
@@ -178,7 +178,7 @@ void Scene301::enter() {
 	}
 
 	if (!_game._visitedScenes._sceneRevisited) {
-		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0));
 		_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
 		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -1, -2);
@@ -469,8 +469,8 @@ void Scene302::setup() {
 }
 
 void Scene302::enter() {
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9");
 
 	if (_game._objects.isInRoom(OBJ_BLUE_FRAME)) {
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
@@ -479,7 +479,7 @@ void Scene302::enter() {
 		_scene->_hotspots.activate(NOUN_BLUE_FRAME, false);
 
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 	}
 
@@ -684,8 +684,8 @@ void Scene303::enter() {
 		_vm->_gameConv->get(26);
 
 	if (_globals[kCurrentYear] == 1993) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1), false);
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0));
 	}
 
 	if ((_game._objects.isInRoom(OBJ_LARGE_NOTE)) && (_globals[kCurrentYear] == 1993)) {
@@ -1004,7 +1004,7 @@ void Scene304::enter() {
 		_vm->_gameConv->get(23);
 
 	if (!_globals[kRightDoorIsOpen504]) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1));
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
 
@@ -1016,7 +1016,7 @@ void Scene304::enter() {
 		_scene->_userInterface.setup(kInputLimitedSentences);
 
 		if (_scene->_priorSceneId == 305) {
-			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0));
 			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 
 			_game._player._stepEnabled = false;
@@ -1026,7 +1026,7 @@ void Scene304::enter() {
 
 		} else {
 
-			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+			_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0));
 			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 
 			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0);
@@ -1599,10 +1599,10 @@ void Scene307::setup() {
 }
 
 void Scene307::enter() {
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9");
 
 	if (_globals[kRightDoorIsOpen504])
 		_scene->_hotspots.activate(NOUN_DOOR, true);
@@ -1905,8 +1905,8 @@ void Scene308::enter() {
 	_skip2Fl = false;
 
 	_vm->_gameConv->get(26);
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
 	_scene->_userInterface.setup(kInputLimitedSentences);
 	_game._player._visible = false;
 
@@ -2243,9 +2243,9 @@ void Scene309::enter() {
 	_boatStatus = 1;
 	_vm->_gameConv->get(26);
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9");
 
 	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
 		_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
@@ -2587,7 +2587,7 @@ void Scene310::enter() {
 	warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y");
 
 	for (int i = 0; i < 4; i++) {
-		_globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('f', i), false);
+		_globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('f', i));
 		_globals._sequenceIndexes[i] = -1;
 	}
 
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index 3e7c1e7..f82b599 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -103,26 +103,26 @@ void Scene401::enter() {
 	_scene->_hotspots.activate(NOUN_SKULL, false);
 	_scene->_hotspots.activate(NOUN_POT, false);
 
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3));
 
 	if (_game.exitCatacombs(0) == -1) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1));
 		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
 	}
 
 	if (_game.exitCatacombs(3) == -1) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0));
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false);
 	}
 
 	if (_game.exitCatacombs(1) == -1) {
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2));
 		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false);
 	}
@@ -131,25 +131,25 @@ void Scene401::enter() {
 		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
-		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4), false);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4));
 		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_SKULL) {
-		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5), false);
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5));
 		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_SKULL, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_POT) {
-		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 6), false);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 6));
 		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_POT, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7));
 		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
 	}
 
@@ -601,20 +601,20 @@ void Scene403::enter() {
 	_scene->_hotspots.activate(NOUN_PLANK, false);
 	_scene->_hotspots.activate(NOUN_GATE, false);
 
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3));
 
 	if (_game.exitCatacombs(0) == -1) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1));
 		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
 	}
 
 	if (_game.exitCatacombs(3) == -1) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0));
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false);
 	}
@@ -622,42 +622,42 @@ void Scene403::enter() {
 	if (_game.exitCatacombs(1) == -1) {
 		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
 		_scene->_hotspots.activate(NOUN_GATE, true);
-		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 9), false);
+		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 9));
 		_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_HOLE) {
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 3), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 3));
 		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_HOLE, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 4), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 4));
 		_scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_WEB, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
-		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 5), false);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 5));
 		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(178, 35));
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
-		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 6), false);
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 6));
 		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_SKULL) {
-		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 7), false);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 7));
 		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_SKULL, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_PLANK) {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 8), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 8));
 		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_PLANK, true);
 	}
@@ -1098,27 +1098,27 @@ void Scene404::enter() {
 
 	_anim0ActvFl = false;
 
-	_globals._spriteIndexes[9] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('f', 3));
 
 
 	if (_game.exitCatacombs(0) == -1) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1));
 		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
 	}
 
 	if (_game.exitCatacombs(3) == -1) {
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0));
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false);
 	}
 
 	if (_game.exitCatacombs(1) == -1) {
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2));
 		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false);
 	}
@@ -1127,30 +1127,30 @@ void Scene404::enter() {
 		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3));
 		_scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
-		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4), false);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4));
 		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_WEB, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_POT) {
-		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5), false);
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5));
 		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_BROKEN_POT, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_BLOCK) {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7));
 		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_FALLEN_BLOCK) {
-		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 8), false);
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 8));
 		_scene->drawToBackground(_globals._spriteIndexes[8], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_BLOCK, true);
 	}
@@ -1587,11 +1587,11 @@ void Scene406::setup() {
 void Scene406::enter() {
 	_game.initCatacombs();
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3));
 
 	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
 		switch (_globals[kCatacombsFrom]) {
@@ -1993,11 +1993,11 @@ void Scene407::setup() {
 void Scene407::enter() {
 	_game.initCatacombs();
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3));
 
 	if (_game.exitCatacombs(3) == -1) {
 		_scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(9, 46));
@@ -2463,14 +2463,14 @@ void Scene408::enter() {
 	_game.initCatacombs();
 	_scene->_hotspots.activate(NOUN_COBWEB, false);
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 2));
 
 	if (_game.exitCatacombs(0) == -1) {
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
@@ -2510,9 +2510,9 @@ void Scene408::enter() {
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
-		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('x', -1), false);
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('x', -1));
 		if (!_globals[kCobwebIsCut]) {
-			_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1));
 			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10);
 			_scene->_hotspots.activate(NOUN_COBWEB, true);
@@ -2533,7 +2533,7 @@ void Scene408::enter() {
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 2));
 		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_EXPOSED_BRICK, false);
 	}
@@ -2931,18 +2931,18 @@ void Scene409::enter() {
 	_scene->loadSpeech(3);
 	_scene->_hotspots.activate(NOUN_SWORD, false);
 
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RDR_9", false);
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RDR_9");
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0));
 
 	if (_game._objects.isInRoom(OBJ_SWORD)) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
-		_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0));
+		_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9");
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 		_scene->_hotspots.activate(NOUN_SWORD, true);
@@ -3523,11 +3523,11 @@ void Scene410::setup() {
 
 void Scene410::enter() {
 	_game._player._visible = false;
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('l', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('l', 1), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('l', 2), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('l', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('l', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('l', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 0));
 
 	for (int i = 1; i < 27; i++) {
 		Common::Point pos;
@@ -4171,60 +4171,60 @@ void Scene453::enter() {
 	_scene->_hotspots.activate(NOUN_HOLE, false);
 	_scene->_hotspots.activate(NOUN_GATE, false);
 
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3));
 
 
 	if (_game.exitCatacombs(0) == -1) {
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1));
 		_scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false);
 	}
 
 	if (_game.exitCatacombs(3) == -1) {
-		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 8), false);
+		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 8));
 		_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false);
 		_scene->_hotspots.activate(NOUN_GATE, true);
 	}
 
 	if (_game.exitCatacombs(1) == -1) {
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2));
 		_scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_DRAIN) {
-		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3), false);
+		_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3));
 		_scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_DRAIN, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) {
-		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4), false);
+		_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4));
 		_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_SKULL, true);
 		_scene->_hotspots.activate(NOUN_RATS_NEST, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) {
-		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5), false);
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5));
 		_scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_WEB, true);
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) {
-		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 6), false);
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 6));
 		_scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(138, 35));
 		_scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(84, 27));
 	}
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_STONE) {
-		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7), false);
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7));
 		_scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_hotspots.activate(NOUN_HOLE, true);
 		_scene->_hotspots.activate(NOUN_STONE, true);
@@ -4648,12 +4648,12 @@ void Scene456::setup() {
 void Scene456::enter() {
 	_game.initCatacombs();
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 1), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 1));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9");
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3));
 
 	if (_game.exitCatacombs(1) == -1) {
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 9a5b8e4..84f5962 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -94,15 +94,15 @@ void Scene501::enter() {
 
 	_vm->_gameConv->get(26);
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0));
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_9", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_8", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDRR_6", false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDRR_6");
 
 	_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6);
 	_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
@@ -734,22 +734,22 @@ void Scene502::enter() {
 	_scene->_hotspots.activate(NOUN_ROPE, false);
 	_scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, false, Common::Point(225, 28));
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 5), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 3), false);
-	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 6), false);
-	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
-	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('j', 0), false);
-	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('k', 0), false);
-	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('l', 0), false);
-	_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('m', 0), false);
-	_globals._spriteIndexes[16] = _scene->_sprites.addSprites(formAnimName('h', 0), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 4));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 5));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 3));
+	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 6));
+	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 0));
+	_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('j', 0));
+	_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('k', 0));
+	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('l', 0));
+	_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('m', 0));
+	_globals._spriteIndexes[16] = _scene->_sprites.addSprites(formAnimName('h', 0));
 
 	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
 		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
@@ -1861,8 +1861,8 @@ void Scene504::enter() {
 
 	_vm->_gameConv->get(26);
 
-	_globals._spriteIndexes[14] = _scene->_sprites.addSprites("*RDR_9", false);
-	_globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('x', 8), false);
+	_globals._spriteIndexes[14] = _scene->_sprites.addSprites("*RDR_9");
+	_globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('x', 8));
 
 	if (!_game._objects.isInRoom(OBJ_MUSIC_SCORE)) {
 		_globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[15], false, 1);
@@ -1870,13 +1870,13 @@ void Scene504::enter() {
 		_scene->_hotspots.activate(NOUN_MUSIC_SCORE, false);
 	}
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2));
 	_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 
 	if (_globals[kFightStatus] == 0)
-		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
+		_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
 
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
 
 	if ((_scene->_priorSceneId == 505) || ((_scene->_priorSceneId == 504) && _globals[kRightDoorIsOpen504])) {
 		if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2)) {
@@ -1884,14 +1884,14 @@ void Scene504::enter() {
 			_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 
 			_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
-			_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0), false);
+			_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0));
 
 			_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 			_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 			_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 			_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 
-			_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5), false);
+			_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5));
 			_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 			_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 6), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 			_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
@@ -1931,7 +1931,7 @@ void Scene504::enter() {
 				_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
 				_anim5ActvFl = true;
 
-				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", false);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2");
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR",PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
@@ -1959,7 +1959,7 @@ void Scene504::enter() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
@@ -1970,7 +1970,7 @@ void Scene504::enter() {
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 
-		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+		_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 
@@ -1983,7 +1983,7 @@ void Scene504::enter() {
 
 	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
 		if (!_globals[kRightDoorIsOpen504]) {
-			_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
+			_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
 			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 		}
@@ -2024,13 +2024,13 @@ void Scene504::enter() {
 				_scene->_hotspots.activate(NOUN_CHRISTINE, true);
 				_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 
-				_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0), false);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0));
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 
-				_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5), false);
+				_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5));
 				_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 6), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
@@ -2064,7 +2064,7 @@ void Scene504::enter() {
 				_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 				_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
 
-				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", false);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3");
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
@@ -2090,7 +2090,7 @@ void Scene504::enter() {
 				_scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100);
 				_anim5ActvFl = true;
 
-				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", false);
+				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3");
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR",PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 				_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
@@ -3191,15 +3191,15 @@ void Scene505::enter() {
 	_scene->_hotspots.activateAtPos(NOUN_LID, false, Common::Point(216, 44));
 	_scene->_hotspots.activate(NOUN_CHRISTINE, false);
 
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 6), false);
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 4), false);
-	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 5), false);
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 4), false);
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 6));
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 4));
+	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 5));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 4));
 
 	if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
 		if (_vm->_gameConv->_restoreRunning == 20) {
@@ -3942,15 +3942,15 @@ void Scene506::enter() {
 
 	_vm->_gameConv->get(26);
 
-	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
-	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1), false);
-	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2), false);
-	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3), false);
-	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 0), false);
-	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
-	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
+	_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 0));
+	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1));
+	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0));
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
-	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9", false);
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9");
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 	_globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);


Commit: 0195ee51e97081fc5e9a531cf5046bd650a12bab
    https://github.com/scummvm/scummvm/commit/0195ee51e97081fc5e9a531cf5046bd650a12bab
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-11T01:50:37+01:00

Commit Message:
MADS: Implement sceneScale for v2+ games

Changed paths:
    engines/mads/scene.cpp
    engines/mads/scene.h



diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 4e7ec2f..01cea11 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -841,8 +841,14 @@ void Scene::playSpeech(int idx) {
 	_vm->_audio->playSound(idx - 1);
 }
 
-void Scene::sceneScale(int front_y, int front_scale, int back_y,  int back_scale) {
-	warning("TODO: Scene:scaleRoom");
+void Scene::sceneScale(int yFront, int maxScale, int yBack,  int minScale) {
+	_sceneInfo->_yBandsEnd = yFront;
+	_sceneInfo->_maxScale = maxScale;
+	_sceneInfo->_yBandsStart = yBack;
+	_sceneInfo->_minScale = minScale;
+
+	_bandsRange = _sceneInfo->_yBandsEnd - _sceneInfo->_yBandsStart;
+	_scaleRange = _sceneInfo->_maxScale - _sceneInfo->_minScale;
 }
 
 void Scene::animations_tick() {
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index 9a9ebf7..e1eee91 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -263,7 +263,7 @@ public:
 	void deleteSequence(int idx);
 	void loadSpeech(int idx);
 	void playSpeech(int idx);
-	void sceneScale(int front_y, int front_scale, int back_y,  int back_scale);
+	void sceneScale(int yFront, int maxScale, int yBack,  int minScale);
 	void animations_tick();
 
 	int _speechReady;


Commit: eb9881965d7aeda7c01b8de1da141b9dcf3990c0
    https://github.com/scummvm/scummvm/commit/eb9881965d7aeda7c01b8de1da141b9dcf3990c0
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-11T14:20:15+01:00

Commit Message:
MADS: Fix ANIMFLAG_DITHER value

Changed paths:
    engines/mads/animation.h



diff --git a/engines/mads/animation.h b/engines/mads/animation.h
index 67adeeb..e13c1c2 100644
--- a/engines/mads/animation.h
+++ b/engines/mads/animation.h
@@ -34,11 +34,12 @@
 namespace MADS {
 
 enum AnimFlag {
-	ANIMFLAG_DITHER				= 0x1000,	// Dither to 16 colors
-	ANIMFLAG_CUSTOM_FONT		= 0x2000,	// Load ccustom font
-	ANIMFLAG_LOAD_BACKGROUND	= 0x0100,	// Load background
+	ANIMFLAG_LOAD_BACKGROUND	  = 0x0100,	// Load background
 	ANIMFLAG_LOAD_BACKGROUND_ONLY = 0x0200,	// Load background only
-	ANIMFLAG_ANIMVIEW			= 0x4000	// Cutscene animation
+
+	ANIMFLAG_DITHER				  = 0x0001,	// Dither to 16 colors
+	ANIMFLAG_CUSTOM_FONT		  = 0x2000,	// Load custom fonts
+	ANIMFLAG_ANIMVIEW			  = 0x4000	// Cutscene animation
 };
 
 enum AnimBgType {


Commit: 8753ee9f95ab7bdd5be8e45c092f84c0d72e5b73
    https://github.com/scummvm/scummvm/commit/8753ee9f95ab7bdd5be8e45c092f84c0d72e5b73
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-12T00:50:39+01:00

Commit Message:
MADS: Rename the parameter of setNextFrameTimer

Changed paths:
    engines/mads/animation.cpp
    engines/mads/animation.h



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index 5020110..d2260da 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -604,8 +604,8 @@ void Animation::setCurrentFrame(int frameNumber) {
 	_freeFlag = false;
 }
 
-void Animation::setNextFrameTimer(uint32 frameNumber) {
-	_nextFrameTimer = frameNumber;
+void Animation::setNextFrameTimer(uint32 newTimer) {
+	_nextFrameTimer = newTimer;
 }
 
 void Animation::eraseSprites() {
diff --git a/engines/mads/animation.h b/engines/mads/animation.h
index e13c1c2..a6a4cfb 100644
--- a/engines/mads/animation.h
+++ b/engines/mads/animation.h
@@ -227,7 +227,7 @@ public:
 	 */
 	void eraseSprites();
 
-	void setNextFrameTimer(uint32 frameNumber);
+	void setNextFrameTimer(uint32 newTimer);
 	uint32 getNextFrameTimer() const { return _nextFrameTimer; }
 	void setCurrentFrame(int frameNumber);
 	int getCurrentFrame() const { return _currentFrame; }


Commit: 002a59c540cdb6a504fa195d38a8f2adf085f53d
    https://github.com/scummvm/scummvm/commit/002a59c540cdb6a504fa195d38a8f2adf085f53d
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-12T00:52:21+01:00

Commit Message:
MADS: Implement syncTimers, add SyncType enum, modify all the calls to syncTimers

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/game.cpp
    engines/mads/game.h
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/sequence.cpp



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index ed446c4..0788fe6 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -315,7 +315,7 @@ void Scene102::step() {
 			switch (_diaryFrame) {
 			case 6:
 				_scene->deleteSequence(_globals._sequenceIndexes[1]);
-				_game.syncTimers(1, _globals._sequenceIndexes[1], 3, _globals._animationIndexes[0]);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_ANIM, _globals._animationIndexes[0]);
 				break;
 
 			case 10:
@@ -349,7 +349,7 @@ void Scene102::step() {
 			switch (_diaryFrame) {
 			case 6:
 				_scene->deleteSequence(_globals._sequenceIndexes[2]);
-				_game.syncTimers(1, _globals._sequenceIndexes[2], 3, _globals._animationIndexes[0]);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_ANIM, _globals._animationIndexes[0]);
 				break;
 
 			case 26:
@@ -385,7 +385,7 @@ void Scene102::step() {
 			int idx = _globals._sequenceIndexes[6];
 			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], -2);
-			_game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx);
 			_game._player._stepEnabled = true;
 			}
 			break;
@@ -426,13 +426,13 @@ void Scene102::actions() {
 			int idx = _globals._sequenceIndexes[6];
 			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 5);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
-			_game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx);
 			}
 			break;
 
 		case 3:
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]);
 			_game._player.walk(Common::Point(0, 130), FACING_WEST);
 			_game._player._walkOffScreenSceneId = 101;
 			break;
@@ -457,7 +457,7 @@ void Scene102::actions() {
 			_game._player._visible = false;
 			_animRunning = 1;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('B',-1), 1);
-			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 			break;
 
 		case 1:
@@ -466,7 +466,7 @@ void Scene102::actions() {
 			_diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
 			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST);
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 			_scene->_sequences.addTimer(6, 2);
 			break;
 
@@ -479,7 +479,7 @@ void Scene102::actions() {
 			_game._player._visible = false;
 			_animRunning = 2;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 4);
-			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 			break;
 
 		case 4:
@@ -489,7 +489,7 @@ void Scene102::actions() {
 			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST);
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
-			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 			break;
 
 		default:
@@ -754,7 +754,7 @@ void Scene103::step() {
 		int tmpIdx = _globals._sequenceIndexes[9];
 		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
-		_game.syncTimers(1, _globals._sequenceIndexes[9], 1, tmpIdx);
+		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx);
 		_game._player._stepEnabled = true;
 		}
 		break;
@@ -772,7 +772,7 @@ void Scene103::step() {
 		int tmpIdx = _globals._sequenceIndexes[10];
 		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
-		_game.syncTimers(1, _globals._sequenceIndexes[10], 1, tmpIdx);
+		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx);
 		_game._player._stepEnabled = true;
 		}
 		break;
@@ -812,13 +812,13 @@ void Scene103::actions() {
 			int tmpIdx = _globals._sequenceIndexes[9];
 			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
-			_game.syncTimers(1, _globals._sequenceIndexes[9], 1, tmpIdx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx);
 			}
 			break;
 
 		case 3:
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[11]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[11]);
 			_scene->_sequences.addTimer(1, 4);
 			break;
 
@@ -839,7 +839,7 @@ void Scene103::actions() {
 			int tmpIdx = _globals._sequenceIndexes[9];
 			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
-			_game.syncTimers(1, _globals._sequenceIndexes[9], 1, tmpIdx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx);
 			_scene->_sequences.addTimer(6, 7);
 			}
 			break;
@@ -878,13 +878,13 @@ void Scene103::actions() {
 			int tmpIdx = _globals._sequenceIndexes[10];
 			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
-			_game.syncTimers(1, _globals._sequenceIndexes[10], 1, tmpIdx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx);
 			}
 			break;
 
 		case 3:
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[11]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[11]);
 			_scene->_sequences.addTimer(1, 4);
 			break;
 
@@ -905,7 +905,7 @@ void Scene103::actions() {
 			int tmpIdx = _globals._sequenceIndexes[10];
 			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
-			_game.syncTimers(1, _globals._sequenceIndexes[10], 1, tmpIdx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx);
 			_scene->_sequences.addTimer(6, 7);
 			}
 			break;
@@ -1393,7 +1393,7 @@ void Scene104::step() {
 
 			if (_tapestryFrame == 13) {
 				_game._player._visible = true;
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 			}
 
 			if ((resetFrame >= 0) && (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame())) {
@@ -1417,7 +1417,7 @@ void Scene104::step() {
 		int idx = _globals._sequenceIndexes[6];
 		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
-		_game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx);
+		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx);
 		_game._player._stepEnabled = true;
 		}
 		break;
@@ -1432,7 +1432,7 @@ void Scene104::step() {
 		_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0);
 		_anim4ActvFl = true;
 		_pidStatus = 0;
-		_game.syncTimers(3, _globals._animationIndexes[4], 4, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_CLOCK, 0);
 
 		_scene->deleteSequence(_globals._sequenceIndexes[14]);
 		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0);
@@ -1550,13 +1550,13 @@ void Scene104::actions() {
 				int tmpIdx = _globals._sequenceIndexes[6];
 				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
-				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx);
 				}
 				break;
 
 			case 3:
 				_game._player._visible = true;
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]);
 				_scene->_sequences.addTimer(1, 4);
 				break;
 
@@ -1577,7 +1577,7 @@ void Scene104::actions() {
 				int tmpIdx = _globals._sequenceIndexes[6];
 				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
-				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx);
 				_scene->_sequences.addTimer(6, 7);
 				}
 				break;
@@ -1618,7 +1618,7 @@ void Scene104::actions() {
 			case 2: {
 				int tmpIdx = _globals._sequenceIndexes[12];
 				_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2);
-				_game.syncTimers(1, _globals._sequenceIndexes[12], 1, tmpIdx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[12], SYNC_SEQ, tmpIdx);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
 				if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) {
 					_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
@@ -1629,7 +1629,7 @@ void Scene104::actions() {
 
 			case 3:
 				_game._player._visible = true;
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 				_scene->_sequences.addTimer(5, 4);
 				break;
 
@@ -1691,7 +1691,7 @@ void Scene104::actions() {
 
 			case 3:
 				_game._player._visible = true;
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 				_scene->_sequences.addTimer(5, 4);
 				break;
 
@@ -1720,12 +1720,12 @@ void Scene104::actions() {
 						_game._player._stepEnabled = false;
 						_game._player._visible = false;
 						_animationRunning = 1;
-						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a',-1), 1);
+						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a', -1), 1);
 						break;
 
 					case 1:
 						_game._player._visible = true;
-						_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+						_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 						_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
 						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(290, 20));
@@ -1777,12 +1777,12 @@ void Scene104::actions() {
 						_game._player._visible = false;
 						_scene->deleteSequence(_globals._sequenceIndexes[10]);
 						_animationRunning = 2;
-						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d',-1), 1);
+						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', -1), 1);
 						break;
 
 					case 1:
 						_game._player._visible = true;
-						_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+						_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 						_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6);
 						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(290, 20));
@@ -2198,7 +2198,7 @@ void Scene104::actions() {
 
 			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6);
-			_game.syncTimers(1, _globals._sequenceIndexes[14], 4, 0);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_CLOCK, 0);
 
 			_globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('e', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
 			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 2), 0);
@@ -2639,7 +2639,7 @@ void Scene104::handleMacAnimation1() {
 			_pidFrame = 105;
 			resetFrame = 26;
 			_scene->setAnimFrame(_globals._animationIndexes[4], 105);
-			_game.syncTimers(3, _globals._animationIndexes[4], 3, _globals._animationIndexes[1]);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_ANIM, _globals._animationIndexes[1]);
 			break;
 
 		default:
@@ -2657,7 +2657,7 @@ void Scene104::handleMacAnimation1() {
 		_scene->setAnimFrame(_globals._animationIndexes[4], 89);
 		_pidFrame = 89;
 		_pidStatus = 7;
-		_game.syncTimers(3, _globals._animationIndexes[4], 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_ANIM, _globals._animationIndexes[1]);
 		break;
 
 	case 76:
@@ -2716,7 +2716,7 @@ void Scene104::handleMacAnimation2() {
 
 	case 2:
 		_scene->deleteSequence(_globals._sequenceIndexes[14]);
-		_game.syncTimers(1, _globals._sequenceIndexes[14], 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_ANIM, _globals._animationIndexes[1]);
 		break;
 
 	case 37:
@@ -2994,7 +2994,7 @@ void Scene104::handlePidAnimation() {
 			_anim4ActvFl = false;
 			_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('d', 2), 95);
 			_anim6ActvFl = true;
-			_game.syncTimers(3, _globals._animationIndexes[4], 4, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_CLOCK, 0);
 			break;
 
 		default:
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index f5a5f3b..7175007 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -599,8 +599,44 @@ void Game::createThumbnail() {
 	::createThumbnail(_saveThumb, _vm->_screen.getData(), MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT, thumbPalette);
 }
 
-void Game::syncTimers(int slave_type, int slave_id, int master_type, int master_id) {
-	warning("TODO: Game_syncTimers");
+void Game::syncTimers(SyncType slaveType, int slaveId, SyncType masterType, int masterId) {
+	uint32 syncTime = 0;
+
+	switch (masterType) {
+	case SYNC_SEQ:
+		syncTime = _scene._sequences[masterId]._timeout;
+		break;
+
+	case SYNC_ANIM:
+		syncTime = _scene._animation[masterId]->getNextFrameTimer();
+		break;
+
+	case SYNC_CLOCK:
+		syncTime = _scene._frameStartTime + masterId;
+		break;
+
+	case SYNC_PLAYER:
+		syncTime = _player._priorTimer;
+		break;
+	}
+
+
+	switch (slaveType) {
+	case SYNC_SEQ:
+		_scene._sequences[slaveId]._timeout = syncTime;
+		break;
+
+	case SYNC_PLAYER:
+		_player._priorTimer = syncTime;
+		break;
+
+	case SYNC_ANIM:
+		_scene._animation[slaveId]->setNextFrameTimer(syncTime);
+		break;
+
+	case SYNC_CLOCK:
+		error("syncTimer is trying to force _frameStartTime");
+	}
 }
 
 void Game::camPanTo(Camera *camera, int target) {
diff --git a/engines/mads/game.h b/engines/mads/game.h
index 30fcf99..c1cd4fd 100644
--- a/engines/mads/game.h
+++ b/engines/mads/game.h
@@ -44,6 +44,11 @@ enum KernelMode {
 	KERNEL_ROOM_PRELOAD = 3, KERNEL_ROOM_INIT = 4, KERNEL_ACTIVE_CODE = 5
 };
 
+enum SyncType {
+	SYNC_SEQ = 1, SYNC_PLAYER = 2, SYNC_ANIM = 3, SYNC_CLOCK = 4
+};
+
+
 #define MADS_SAVEGAME_VERSION 1
 
 struct MADSSavegameHeader {
@@ -236,7 +241,7 @@ public:
 	 */
 	void createThumbnail();
 
-	void syncTimers(int slave_type, int slave_id, int master_type, int master_id);
+	void syncTimers(SyncType slaveType, int slaveId, SyncType masterType, int masterId);
 
 	typedef struct {
 		//TODO
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 11cf1c7..6142175 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -1168,7 +1168,7 @@ void Scene103::step() {
 		int syncIdx = _globals._sequenceIndexes[1];
 		_vm->_sound->command(25);
 		_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
-		_game.syncTimers(1, _globals._sequenceIndexes[1], 1, syncIdx);
+		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, syncIdx);
 		_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 		_game._player._stepEnabled = true;
 		}
@@ -1197,7 +1197,7 @@ void Scene103::step() {
 		_anim5ActvFl = true;
 		_scene->setAnimFrame(_globals._animationIndexes[5], 33);
 		_game._player._stepEnabled = true;
-		_game.syncTimers(3, _globals._animationIndexes[5], 1, _globals._sequenceIndexes[10]);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[5], SYNC_SEQ, _globals._sequenceIndexes[10]);
 		break;
 
 	default:
@@ -1306,7 +1306,7 @@ void Scene103::preActions() {
 						_game._player._needToWalk = false;
 					_anim6ActvFl = false;
 					_game._player.resetFacing(FACING_NORTHEAST);
-					_game.syncTimers(2, 0, 3, _globals._animationIndexes[6]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[6]);
 					break;
 
 				default:
@@ -1336,7 +1336,7 @@ void Scene103::preActions() {
 					_standPosition = 0;
 					_anim4ActvFl = false;
 					_game._player.resetFacing(FACING_NORTHEAST);
-					_game.syncTimers(2, 0, 3, _globals._animationIndexes[4]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[4]);
 					break;
 
 				default:
@@ -1415,7 +1415,7 @@ void Scene103::actions() {
 				_game._player._visible = false;
 				_game._player._stepEnabled = false;
 				_anim5ActvFl = true;
-				_game.syncTimers(3, _globals._animationIndexes[5], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[5], SYNC_PLAYER, 0);
 				_action._inProgress = false;
 				return;
 			}
@@ -1429,7 +1429,7 @@ void Scene103::actions() {
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
 			_anim3ActvFl = true;
-			_game.syncTimers(3, _globals._animationIndexes[3], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[3], SYNC_PLAYER, 0);
 			_action._inProgress = false;
 			return;
 		}
@@ -1450,7 +1450,7 @@ void Scene103::actions() {
 						_game._player._visible = false;
 						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 1), 75);
 						_game._player._priorTimer = _scene->_frameStartTime;
-						_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+						_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 						_scene->deleteSequence(_globals._sequenceIndexes[3]);
 					}
 					break;
@@ -1462,13 +1462,13 @@ void Scene103::actions() {
 						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
 						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139));
-						_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[0]);
+						_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_ANIM, _globals._animationIndexes[0]);
 						_globals[kPrompterStandStatus] = 1;
 						_game._player._stepEnabled = true;
 						_game._player._visible = true;
 						_game._player._playerPos = Common::Point(117, 139);
 						_game._player.resetFacing(FACING_EAST);
-						_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+						_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 
 						_scene->_dynamicHotspots.remove(_hotspotPrompt1);
 						_scene->_dynamicHotspots.remove(_hotspotPrompt2);
@@ -1522,7 +1522,7 @@ void Scene103::actions() {
 						_game._player._visible = false;
 						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 2), 75);
 						_game._player._priorTimer = _scene->_frameStartTime;
-						_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+						_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 						_scene->deleteSequence(_globals._sequenceIndexes[12]);
 						_scene->deleteSequence(_globals._sequenceIndexes[3]);
 					}
@@ -1533,13 +1533,13 @@ void Scene103::actions() {
 						_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
 						_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
 						_scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139));
-						_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[0]);
+						_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_ANIM, _globals._animationIndexes[0]);
 						_globals[kPrompterStandStatus] = 0;
 						_game._player._stepEnabled = true;
 						_game._player._visible = true;
 						_game._player._playerPos = Common::Point(62, 142);
 						_game._player.resetFacing(FACING_WEST);
-						_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+						_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 						_scene->_dynamicHotspots.remove(_hotspotPrompt1);
 						_scene->_dynamicHotspots.remove(_hotspotPrompt2);
 						_scene->_dynamicHotspots.remove(_hotspotPrompt3);
@@ -1606,7 +1606,7 @@ void Scene103::actions() {
 
 			case 2:
 				_game._player._visible = true;
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]);
 				_game._player.walk(Common::Point(295, 132), FACING_WEST);
 				_scene->_sequences.addTimer(180, 3);
 				break;
@@ -1628,7 +1628,7 @@ void Scene103::actions() {
 			case 71: {
 				int oldIdx = _globals._sequenceIndexes[1];
 				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2);
-				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, oldIdx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, oldIdx);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 				}
 				break;
@@ -1650,7 +1650,7 @@ void Scene103::actions() {
 			case 1: {
 				int oldIdx = _globals._sequenceIndexes[2];
 				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, oldIdx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_SEQ, oldIdx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
 				_scene->_sequences.addTimer(15, 2);
 				_vm->_sound->command(73);
@@ -1666,7 +1666,7 @@ void Scene103::actions() {
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]);
 				_game._player._visible = true;
 				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
 					_vm->_dialogs->show(00032);
@@ -1706,7 +1706,7 @@ void Scene103::actions() {
 			return;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			_action._inProgress = false;
@@ -1782,7 +1782,7 @@ void Scene103::actions() {
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], -1, -2);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
 				if (!_sitFl)
-					_game.syncTimers(1, _globals._sequenceIndexes[10], 3, _globals._animationIndexes[5]);
+					_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_ANIM, _globals._animationIndexes[5]);
 				_sitFl = false;
 				break;
 
@@ -1807,7 +1807,7 @@ void Scene103::actions() {
 				_anim1ActvFl = true;
 				_game._player._visible = false;
 				_game._player._stepEnabled = false;
-				_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0);
 				break;
 
 			case 1:
@@ -1815,7 +1815,7 @@ void Scene103::actions() {
 				_game._player._visible = true;
 				_globals[kTrapDoorStatus] = 0;
 				_game._player._stepEnabled = true;
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 				break;
 
 			default:
@@ -1828,7 +1828,7 @@ void Scene103::actions() {
 				_anim2ActvFl = true;
 				_game._player._visible = false;
 				_game._player._stepEnabled = false;
-				_game.syncTimers(3, _globals._animationIndexes[2], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[2], SYNC_PLAYER, 0);
 				break;
 
 			case 1:
@@ -1836,7 +1836,7 @@ void Scene103::actions() {
 				_game._player._visible = true;
 				_globals[kTrapDoorStatus] = 1;
 				_game._player._stepEnabled = true;
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[2]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[2]);
 				break;
 
 			default:
@@ -3110,7 +3110,7 @@ void Scene104::handleWalkAnimation() {
 		if (_walkStatus == 0) {
 			daaeResetFrame = 0;
 		} else {
-			_game.syncTimers(3, _globals._animationIndexes[2], 3, _globals._animationIndexes[1]);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[2], SYNC_ANIM, _globals._animationIndexes[1]);
 			daaeResetFrame = 1;
 		}
 		break;
@@ -3552,7 +3552,7 @@ void Scene104::handleCoupleAnimations() {
 		_game._player.resetFacing(FACING_SOUTH);
 		resetFrame = 105;
 		_game._player._visible = true;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 		break;
 
 	case 106:
@@ -3748,17 +3748,17 @@ void Scene105::actions() {
 			_game._player._visible = false;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 70);
 			_scene->deleteSequence(_globals._sequenceIndexes[4]);
-			_game.syncTimers(1, _globals._sequenceIndexes[4], 3, _globals._animationIndexes[0]);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[4], SYNC_ANIM, _globals._animationIndexes[0]);
 			_scene->_sequences.setSeqPlayer(_globals._animationIndexes[0], false);
 			break;
 
 		case 70:
 			_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 2);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
-			_game.syncTimers(1, _globals._sequenceIndexes[4], 3, _globals._animationIndexes[0]);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[4], SYNC_ANIM, _globals._animationIndexes[0]);
 			_game._player._stepEnabled = true;
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 			break;
 
 		default:
@@ -3774,7 +3774,7 @@ void Scene105::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1);
-			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 			break;
 
 		case 1:
@@ -3794,7 +3794,7 @@ void Scene105::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1);
-			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 			break;
 
 		case 1:
@@ -3844,7 +3844,7 @@ void Scene105::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
@@ -3883,7 +3883,7 @@ void Scene105::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[6]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
@@ -3936,7 +3936,7 @@ void Scene105::actions() {
 			case 66: {
 				int tmpIdx = _globals._sequenceIndexes[2];
 				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 8);
-				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, tmpIdx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_SEQ, tmpIdx);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 				_game._player.walk(Common::Point(0, 111), FACING_NORTHWEST);
 				}
@@ -3959,7 +3959,7 @@ void Scene105::actions() {
 			case 1: {
 				int tmpIdx = _globals._sequenceIndexes[6];
 				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], true, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[6], 1, tmpIdx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false);
 				_vm->_sound->command(73);
 				_scene->_sequences.addTimer(15, 2);
@@ -3975,7 +3975,7 @@ void Scene105::actions() {
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[6]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[6]);
 				_game._player._visible = true;
 				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
 					_vm->_dialogs->show(32);
@@ -4346,7 +4346,7 @@ void Scene106::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]);
 				_game._player._visible = true;
 				_scene->_sequences.addTimer(20, 3);
 				break;
@@ -4386,7 +4386,7 @@ void Scene106::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]);
 				_game._player._visible = true;
 				_scene->_sequences.addTimer(20, 3);
 				break;
@@ -4410,7 +4410,7 @@ void Scene106::actions() {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 76);
-		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 		_action._inProgress = false;
 		return;
 
@@ -4423,7 +4423,7 @@ void Scene106::actions() {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 81);
-		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 		_action._inProgress = false;
 		return;
 
@@ -4457,7 +4457,7 @@ void Scene106::actions() {
 				break;
 
 			case 1:
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 				_game._player._visible = true;
 				_game._player._playerPos = Common::Point(225, 143);
 				_game._player.resetFacing(FACING_EAST);
@@ -4494,11 +4494,11 @@ void Scene106::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 1), 3);
-				_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				_game._player._playerPos = Common::Point(228, 140);
@@ -4539,7 +4539,7 @@ void Scene106::actions() {
 		case 66: {
 			int idx = _globals._sequenceIndexes[2];
 			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 5);
-			_game.syncTimers(1, _globals._sequenceIndexes[2], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_SEQ, idx);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
 			}
 			break;
@@ -4844,7 +4844,7 @@ void Scene107::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
@@ -5799,11 +5799,11 @@ void Scene109::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('w', 2), 2);
-				_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0);
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 				_scene->sceneScale(155, 95, 130, 78);
 				_anim1ActvFl = false;
 				_game._player._visible = true;
@@ -5832,11 +5832,11 @@ void Scene109::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('w', 1), 2);
-				_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 				_scene->sceneScale(311, 95, 286, 78);
 				_anim0ActvFl = false;
 				_game._player._visible = true;
@@ -5876,11 +5876,11 @@ void Scene109::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('w', 3), 3);
-				_game.syncTimers(3, _globals._animationIndexes[2], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[2], SYNC_PLAYER, 0);
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[2]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[2]);
 				_scene->sceneScale(467, 95, 442, 78);
 				_anim2ActvFl = false;
 				_game._player._visible = true;
@@ -5914,11 +5914,11 @@ void Scene109::actions() {
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
 				_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 4), 3);
-				_game.syncTimers(3, _globals._animationIndexes[3], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[3], SYNC_PLAYER, 0);
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[3]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[3]);
 				_scene->sceneScale(311, 95, 286, 78);
 				_anim3ActvFl = false;
 				_game._player._visible = true;
@@ -5954,7 +5954,7 @@ void Scene109::actions() {
 
 		case 2:
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 			if (_currentFloor == 3)
 				_game._player.walk(Common::Point(2, 131), FACING_WEST);
 			else if (_currentFloor == 2)
@@ -5989,12 +5989,12 @@ void Scene109::actions() {
 			if (_currentFloor == 3) {
 				int idx = _globals._sequenceIndexes[0];
 				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 3);
-				_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 			} else if (_currentFloor == 2) {
 				int idx = _globals._sequenceIndexes[1];
 				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 3);
-				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 			}
 			break;
@@ -6182,7 +6182,7 @@ void Scene110::actions() {
 		case 1: {
 			int idx = _globals._sequenceIndexes[1];
 			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4);
-			_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
 			_scene->_sequences.addTimer(30, 2);
 			_vm->_sound->command(73);
@@ -6198,7 +6198,7 @@ void Scene110::actions() {
 			break;
 
 		case 3:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
 			if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
@@ -6232,7 +6232,7 @@ void Scene110::actions() {
 			case 1: {
 				int idx = _globals._sequenceIndexes[1];
 				_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false);
 				_scene->_sequences.addTimer(30, 2);
 				_vm->_sound->command(73);
@@ -6248,7 +6248,7 @@ void Scene110::actions() {
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
@@ -6288,7 +6288,7 @@ void Scene110::actions() {
 				break;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 				_game._player._visible = true;
 				_game._player.walk(Common::Point(261, 121), FACING_NORTHEAST);
 				_game._player.setWalkTrigger(4);
@@ -6615,7 +6615,7 @@ void Scene111::step() {
 
 	case 64:
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 70);
-		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 		_anim0ActvFl = true;
 		_listenStatus = 0;
 		_game._player._visible = false;
@@ -6624,7 +6624,7 @@ void Scene111::step() {
 	case 70:
 		_game._player._visible = true;
 		_anim0ActvFl = false;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 		_scene->_sequences.addTimer(30, 71);
 		break;
 
@@ -6659,7 +6659,7 @@ void Scene111::actions() {
 		case 1: {
 			int idx = _globals._sequenceIndexes[0];
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4);
-			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
 			_scene->_sequences.addTimer(30, 2);
 			_vm->_sound->command(73);
@@ -6677,7 +6677,7 @@ void Scene111::actions() {
 			return;
 
 		case 3:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 			_game._player._visible = true;
 			if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
 				_vm->_dialogs->show(32);
@@ -6709,7 +6709,7 @@ void Scene111::actions() {
 			case 1: {
 				int idx = _globals._sequenceIndexes[0];
 				_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
 				_scene->_sequences.addTimer(30, 2);
 				_vm->_sound->command(73);
@@ -6727,7 +6727,7 @@ void Scene111::actions() {
 				return;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 				_game._player._visible = true;
 
 				if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK))
@@ -6772,10 +6772,10 @@ void Scene111::actions() {
 			case 1:
 				_globals[kChristineDoorStatus] = 2;
 				_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
-				_game.syncTimers(1, _globals._sequenceIndexes[3], 3, _globals._animationIndexes[1]);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_ANIM, _globals._animationIndexes[1]);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
 				_scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100);
-				_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 				_game._player._visible = true;
 				_game._player._playerPos = Common::Point(126, 126);
 				_anim1ActvFl = false;
@@ -7087,7 +7087,7 @@ void Scene112::actions() {
 	if ((_action.isAction(VERB_TALK_TO, NOUN_JULIE)) || (_action.isAction(VERB_TALK_TO, NOUN_WOMAN))) {
 		if (_globals[kJulieNameIsKnown] > 0) {
 			_game._player._visible = false;
-			_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0);
 			_scene->setAnimFrame(_globals._animationIndexes[1], 1);
 			_raoulAction = 1;
 		}
@@ -7354,7 +7354,7 @@ void Scene112::handleConversation() {
 	case 72:
 		_vm->_gameConv->release();
 		_game._player._visible = false;
-		_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0);
 		_scene->setAnimFrame(_globals._animationIndexes[1], 1);
 		_raoulAction = 1;
 		break;
@@ -7613,7 +7613,7 @@ void Scene112::handleRaoulChair() {
 		_raoulAction = 2;
 		_game._player._visible = true;
 		_vm->_gameConv->release();
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 		break;
 
 	case 83:
@@ -8027,7 +8027,7 @@ void Scene113::step() {
 		_prevent2 = true;
 		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0);
 		_scene->setAnimFrame (_globals._animationIndexes[0], 86);
-		_game.syncTimers(3, _globals._animationIndexes[0], 4, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_CLOCK, 0);
 		_scene->animations_tick();
 	}
 
@@ -8039,7 +8039,7 @@ void Scene113::step() {
 			_dayStatus = 7;
 			_raoulAction = 3;
 			_armsOutFl = true;
-			_game.syncTimers(3, _globals._animationIndexes[0], 3, _globals._animationIndexes[1]);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_ANIM, _globals._animationIndexes[1]);
 		}
 
 		if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 165) && !_afterKissFl)
@@ -8602,7 +8602,7 @@ void Scene113::handleDayAnimation() {
 	case 182:
 		_game._player._visible = true;
 		_vm->_gameConv->release();
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 		_game._player._playerPos = Common::Point(175, 148);
 		_game._player._turnToFacing = FACING_NORTHEAST;
 		_game._player.resetFacing(FACING_SOUTHEAST);
@@ -8705,7 +8705,7 @@ void Scene113::handleRaoulAnimation() {
 			resetFrame = 33;
 			_raoulAction = 3;
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 3, _globals._animationIndexes[3]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[3]);
 		}
 		break;
 
@@ -8947,7 +8947,7 @@ void Scene113::handleFlorentConversation() {
 		_vm->_gameConv->release();
 		_game._player._visible = false;
 		_raoulAction = 1;
-		_game.syncTimers(3, _globals._animationIndexes[3], 2, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[3], SYNC_PLAYER, 0);
 		_scene->setAnimFrame(_globals._animationIndexes[3], 1);
 		break;
 
@@ -9111,7 +9111,7 @@ void Scene113::handleLoveConversation() {
 		_vm->_gameConv->release();
 		_game._player._visible = false;
 		_raoulAction = 1;
-		_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0);
 		_scene->setAnimFrame(_globals._animationIndexes[1], 1);
 		break;
 
@@ -9206,7 +9206,7 @@ void Scene114::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1);
-			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 			break;
 
 		case 1:
@@ -9247,7 +9247,7 @@ void Scene114::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index b00b0a2..84cb4fa 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -853,7 +853,7 @@ void Scene202::actions() {
 		case 81: {
 			int idx = _globals._sequenceIndexes[0];
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
-			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 			_game._player.walk(Common::Point(134, 112), FACING_NORTH);
 			_game._player.setWalkTrigger(83);
@@ -1781,7 +1781,7 @@ void Scene203::actions() {
 
 		case 92:
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[4]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]);
 			_game._player.walk(Common::Point(319, 123), FACING_WEST);
 			_game._player.setWalkTrigger(93);
 			break;
@@ -1802,7 +1802,7 @@ void Scene203::actions() {
 		_anim1ActvFl = true;
 		_game._player._visible = false;
 		_raoulStatus = 0;
-		_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0);
 
 		_vm->_gameConv->run(5);
 		_vm->_gameConv->hold();
@@ -1835,7 +1835,7 @@ void Scene203::actions() {
 			_game._player._visible = false;
 			_game._player._stepEnabled = false;
 			_raoulStatus = 0;
-			_game.syncTimers(3, _globals._animationIndexes[1], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0);
 
 			_vm->_gameConv->run(8);
 			_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
@@ -3134,7 +3134,7 @@ void Scene203::handleRaoulAnimation() {
 		_anim1ActvFl = false;
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 		resetFrame = 58;
 		if (_globals[kDoneBrieConv203] && (_globals[kCurrentYear] == 1993)) {
 			_globals[kPrompterStandStatus] = 1;
@@ -3529,7 +3529,7 @@ void Scene204::actions() {
 
 		case 61:
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]);
 			_game._player.walk(Common::Point(0, 136), FACING_WEST);
 			_game._player.setWalkTrigger(62);
 			break;
@@ -3565,7 +3565,7 @@ void Scene204::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[4]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
@@ -3948,7 +3948,7 @@ void Scene204::handleFlorAnimation() {
 	switch (_florFrame) {
 	case 80:
 		_scene->setAnimFrame(_globals._animationIndexes[2], 1);
-		_game.syncTimers(3, _globals._animationIndexes[2], 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[2], SYNC_ANIM, _globals._animationIndexes[1]);
 		_raoulStatus = 1;
 		break;
 
@@ -4478,7 +4478,7 @@ void Scene205::step() {
 		break;
 
 	case 102:
-		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]);
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
 		_vm->_gameConv->release();
@@ -4598,7 +4598,7 @@ void Scene205::actions() {
 			case 1: {
 				int idx = _globals._sequenceIndexes[2];
 				_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4);
-				_game.syncTimers(1, _globals._sequenceIndexes[2], 1, idx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_SEQ, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false);
 				_vm->_sound->command(72);
 				_scene->_sequences.addTimer(15, 2);
@@ -4616,7 +4616,7 @@ void Scene205::actions() {
 				return;
 
 			case 3:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				if (_action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK))
@@ -4666,12 +4666,12 @@ void Scene205::actions() {
 				if (_action.isObject(NOUN_BOX_FIVE)) {
 					int idx = _globals._sequenceIndexes[0];
 					_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
-					_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+					_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 				} else if (_action.isObject(NOUN_BOX_NINE)) {
 					int idx = _globals._sequenceIndexes[1];
 					_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2);
-					_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
+					_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
 				}
 				_action._inProgress = false;
@@ -4679,7 +4679,7 @@ void Scene205::actions() {
 
 			case 2:
 				_game._player._visible = true;
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[2]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]);
 				if (_action.isObject(NOUN_BOX_FIVE)) {
 					_game._player.walk(Common::Point(37, 64), FACING_NORTH);
 					_game._player.setWalkTrigger(3);
@@ -6029,7 +6029,7 @@ void Scene206::actions() {
 			return;
 
 		case 78:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 79);
 			_action._inProgress = false;
@@ -6142,7 +6142,7 @@ void Scene206::actions() {
 				_vm->_sound->command(71);
 				int idx = _globals._sequenceIndexes[5];
 				_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], true, -2);
-				_game.syncTimers(1, _globals._sequenceIndexes[5], 1, idx);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[5], SYNC_SEQ, idx);
 				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], false);
 				_scene->_sequences.addTimer(30, 65);
 				}
@@ -6175,7 +6175,7 @@ void Scene206::actions() {
 					}
 				}
 
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[5]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]);
 				_game._player._stepEnabled = true;
 				_game._player._visible = true;
 				break;
@@ -6298,7 +6298,7 @@ void Scene206::actions() {
 	switch (_game._trigger) {
 	case 95:
 		_game._player._visible = true;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 		_scene->_hotspots.activate(NOUN_PANEL, true);
 		_scene->_hotspots.activate(NOUN_KEYHOLE, true);
 		_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3);
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 516376f..3c7bae5 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -202,7 +202,7 @@ void Scene301::step() {
 		_anim0ActvFl = true;
 		_game._player._visible = false;
 		_globals[kPlayerScore] += 10;
-		_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 	}
 
 	if (_anim0ActvFl && !_skip1Fl) {
@@ -244,7 +244,7 @@ void Scene301::actions() {
 			_game._player._stepEnabled = false;
 			_game._player._visible = false;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1);
-			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 			break;
 
 		case 1:
@@ -527,7 +527,7 @@ void Scene302::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
@@ -735,7 +735,7 @@ void Scene303::step() {
 		_game._player._playerPos = Common::Point(110, 95);
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 		_game._player.resetFacing(FACING_SOUTHWEST);
 	}
 
@@ -758,14 +758,14 @@ void Scene303::actions() {
 			_game._player._visible = false;
 			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('n', 1), 1);
 			_anim0ActvFl = true;
-			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 			_globals[kPlayerScore] += 5;
 			break;
 
 		case 1:
 			_anim0ActvFl = false;
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 			_scene->_sequences.addTimer(20, 2);
 			break;
 
@@ -788,7 +788,7 @@ void Scene303::actions() {
 				_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 3);
 				_game._player._stepEnabled = false;
 				_game._player._visible = false;
-				_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+				_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 				break;
 
 			case 3:
@@ -1687,7 +1687,7 @@ void Scene307::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
@@ -1731,7 +1731,7 @@ void Scene307::actions() {
 		case 71: {
 			int idx = _globals._sequenceIndexes[3];
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
-			_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
 			_scene->_sequences.addTimer(10, 73);
 			 }
@@ -2390,7 +2390,7 @@ void Scene309::actions() {
 		case 61: {
 			int idx = _globals._sequenceIndexes[0];
 			_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
-			_game.syncTimers(1, _globals._sequenceIndexes[0], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
 			_game._player.walk(Common::Point(0, 121), FACING_NORTHWEST);
 			_game._player.setWalkTrigger(63);
@@ -2517,7 +2517,7 @@ void Scene309::handleBoatAnimation() {
 
 	switch (_boatFrame) {
 	case 72:
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 		_game._player._visible = true;
 		break;
 
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index f82b599..c9472ea 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -299,7 +299,7 @@ void Scene401::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
@@ -356,7 +356,7 @@ void Scene401::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
@@ -796,7 +796,7 @@ void Scene403::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -852,7 +852,7 @@ void Scene403::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -1308,7 +1308,7 @@ void Scene404::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[9]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[9]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -1363,7 +1363,7 @@ void Scene404::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[9]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[9]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -1718,7 +1718,7 @@ void Scene406::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -1774,7 +1774,7 @@ void Scene406::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -1900,7 +1900,7 @@ void Scene406::actions() {
 
 		case 4:
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 			_scene->_sequences.addTimer(6, 5);
 			break;
 
@@ -2180,7 +2180,7 @@ void Scene407::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
@@ -2240,7 +2240,7 @@ void Scene407::actions() {
 						break;
 
 					case 2:
-						_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+						_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 						_game._player._visible = true;
 						_game._player._stepEnabled = true;
 						break;
@@ -2649,7 +2649,7 @@ void Scene408::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -2706,7 +2706,7 @@ void Scene408::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -3050,7 +3050,7 @@ void Scene409::enter() {
 void Scene409::step() {
 	if (_game._trigger == 60) {
 		_game._player._visible = false;
-		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]);
 		_scene->playSpeech(3);
 	}
 
@@ -3089,7 +3089,7 @@ void Scene409::actions() {
 		case 1: {
 			int syncIdx = _globals._sequenceIndexes[8];
 			_globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, 4);
-			_game.syncTimers(1, _globals._sequenceIndexes[8], 1, syncIdx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[8], SYNC_SEQ, syncIdx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], false);
 			_scene->_sequences.addTimer(30, 2);
 			_action._inProgress = false;
@@ -3106,7 +3106,7 @@ void Scene409::actions() {
 			return;
 
 		case 3:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 			_game._player._visible = true;
 			_vm->_dialogs->show(40923);
 			_game._player._stepEnabled = true;
@@ -3186,7 +3186,7 @@ void Scene409::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
@@ -3243,7 +3243,7 @@ void Scene409::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
@@ -3295,7 +3295,7 @@ void Scene409::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
@@ -3432,7 +3432,7 @@ void Scene409::actions() {
 
 		case 4:
 			_game._player._visible = true;
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 			_scene->_sequences.addTimer(6, 5);
 			break;
 
@@ -4359,7 +4359,7 @@ void Scene453::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
@@ -4416,7 +4416,7 @@ void Scene453::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
@@ -4785,7 +4785,7 @@ void Scene456::actions() {
 					break;
 
 				case 2:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 					_game._player._visible = true;
 					_game._player._stepEnabled = true;
 					break;
@@ -4843,7 +4843,7 @@ void Scene456::actions() {
 				break;
 
 			case 2:
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				break;
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 84f5962..dcc0a2e 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -300,7 +300,7 @@ void Scene501::actions() {
 		case 1: {
 			int idx = _globals._sequenceIndexes[3];
 			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
-			_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx);
 			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
 			_scene->_sequences.addTimer(15, 2);
 			_vm->_sound->command(74);
@@ -316,7 +316,7 @@ void Scene501::actions() {
 			break;
 
 		case 3:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[3]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]);
 			_game._player._visible = true;
 			_vm->_dialogs->show(50122);
 			_game._player._stepEnabled = true;
@@ -345,7 +345,7 @@ void Scene501::actions() {
 				case 1: {
 					int idx = _globals._sequenceIndexes[3];
 					_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
-					_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
+					_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
 					_scene->_sequences.addTimer(15, 2);
 					_vm->_sound->command(74);
@@ -361,7 +361,7 @@ void Scene501::actions() {
 					break;
 
 				case 3:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[3]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]);
 					_game._player._visible = true;
 					_vm->_dialogs->show(50120);
 					_game._player._stepEnabled = true;
@@ -425,7 +425,7 @@ void Scene501::actions() {
 					int idx = _globals._sequenceIndexes[1];
 					_scene->deleteSequence(_globals._sequenceIndexes[1]);
 					_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1);
-					_game.syncTimers(1, _globals._sequenceIndexes[1], 1, idx);
+					_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx);
 					_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
 					_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
 					_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
@@ -470,7 +470,7 @@ void Scene501::actions() {
 				case 1: {
 					int idx = _globals._sequenceIndexes[3];
 					_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4);
-					_game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx);
+					_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx);
 					_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false);
 					_scene->_sequences.addTimer(15, 2);
 					_vm->_sound->command(73);
@@ -486,7 +486,7 @@ void Scene501::actions() {
 					break;
 
 				case 3:
-					_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[3]);
+					_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]);
 					_game._player._visible = true;
 					_vm->_dialogs->show(50120);
 					_game._player._stepEnabled = true;
@@ -939,7 +939,7 @@ void Scene502::actions() {
 		return;
 
 	case 91:
-		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]);
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
 		_scene->_sequences.addTimer(5, 102);
@@ -959,7 +959,7 @@ void Scene502::actions() {
 		return;
 
 	case 96:
-		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]);
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
 		_scene->_sequences.addTimer(5, 102);
@@ -979,7 +979,7 @@ void Scene502::actions() {
 		return;
 
 	case 101:
-		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]);
 		_game._player._visible = true;
 		_scene->_sequences.addTimer(5, 102);
 		_action._inProgress = false;
@@ -1004,7 +1004,7 @@ void Scene502::actions() {
 		return;
 
 	case 106:
-		_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[10]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]);
 		_game._player._visible = true;
 		_scene->_sequences.addTimer(5, 102);
 		_action._inProgress = false;
@@ -1073,7 +1073,7 @@ void Scene502::actions() {
 				_game._player._stepEnabled = true;
 				_game._player._visible = true;
 				_panelTurningFl = false;
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]);
 				_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
 				_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 13);
 				_scene->_hotspots.activate(NOUN_ROPE, true);
@@ -1614,7 +1614,7 @@ void Scene502::handlePanelAnimation() {
 		case 3:
 			_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, newSprId);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14);
-			_game.syncTimers(1, _globals._sequenceIndexes[11], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[11], SYNC_SEQ, idx);
 			_scene->_sequences.addTimer(5, 113);
 			break;
 
@@ -1624,7 +1624,7 @@ void Scene502::handlePanelAnimation() {
 		case 7:
 			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, newSprId);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14);
-			_game.syncTimers(1, _globals._sequenceIndexes[12], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[12], SYNC_SEQ, idx);
 			_scene->_sequences.addTimer(5, 113);
 			break;
 
@@ -1634,14 +1634,14 @@ void Scene502::handlePanelAnimation() {
 		case 11:
 			_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, newSprId);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14);
-			_game.syncTimers(1, _globals._sequenceIndexes[13], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[13], SYNC_SEQ, idx);
 			_scene->_sequences.addTimer(5, 113);
 			break;
 
 		default:
 			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, newSprId);
 			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14);
-			_game.syncTimers(1, _globals._sequenceIndexes[14], 1, idx);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_SEQ, idx);
 			_scene->_sequences.addTimer(5, 113);
 			break;
 		}
@@ -2153,7 +2153,7 @@ void Scene504::step() {
 
 	if (_game._trigger == 60) {
 		_game._player._visible = true;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 		_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
 		_scene->_sequences.addTimer(30, 61);
 	}
@@ -2241,14 +2241,14 @@ void Scene504::step() {
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
 		_anim0ActvFl = false;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 	}
 
 	if (_game._trigger == 136)
 		_scene->_nextSceneId = 506;
 
 	if (_game._trigger == 100) {
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 		_game._player._playerPos = Common::Point(156, 114);
 		_game._player._visible = true;
 		_anim1ActvFl = false;
@@ -2276,7 +2276,7 @@ void Scene504::actions() {
 			_game._player._visible = false;
 			_anim2ActvFl = true;
 			_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('c', 1), 0);
-			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
+			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
 		} else
 			_vm->_dialogs->show(50436);
 		_action._inProgress = false;
@@ -2300,7 +2300,7 @@ void Scene504::actions() {
 		_game._player._stepEnabled = true;
 		_game._player._visible = true;
 		_anim0ActvFl = false;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 		_action._inProgress = false;
 		return;
 	}
@@ -2324,7 +2324,7 @@ void Scene504::actions() {
 	}
 
 	if (_game._trigger == 100) {
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 		_game._player._playerPos = Common::Point(156, 114);
 		_game._player._visible = true;
 		_anim1ActvFl = false;
@@ -2417,7 +2417,7 @@ void Scene504::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[14]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[14]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			_action._inProgress = false;
@@ -2878,7 +2878,7 @@ void Scene504::handlePhantomAnimation2() {
 		_game._player._facing = FACING_WEST;
 		_game._player._visible = true;
 		_globals[kPlayerScore] += 5;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[3]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[3]);
 		_game._player.walk(Common::Point(130, 135), FACING_NORTHEAST);
 		_scene->_hotspots.activate(NOUN_CHRISTINE, false);
 		_game._player.setWalkTrigger(120);
@@ -3364,7 +3364,7 @@ void Scene505::actions() {
 				_game._player._visible = true;
 				_game._player._stepEnabled = true;
 				_globals[kCoffinStatus] = 1;
-				_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]);
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
 				_action._inProgress = false;
 				return;
 
@@ -3420,7 +3420,7 @@ void Scene505::actions() {
 				break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]);
 			_game._player._visible = true;
 			_game._player._stepEnabled = true;
 			if (_bothStatus == 1) {
@@ -3647,7 +3647,7 @@ void Scene505::handleCoffinDialog() {
 
 	case 75:
 		_game._player._visible = true;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 		_scene->_sequences.addTimer(10, 76);
 		break;
 
@@ -3776,7 +3776,7 @@ void Scene505::handleBothanimation() {
 
 	case 68:
 		_game._player._visible = false;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 		break;
 
 	case 106:
@@ -3865,7 +3865,7 @@ void Scene505::handlePartedAnimation() {
 		_game._player._playerPos = Common::Point(93, 133);
 		_game._player.resetFacing(FACING_WEST);
 		_game._player._visible = true;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[2]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[2]);
 		break;
 
 	case 70:
@@ -4050,7 +4050,7 @@ void Scene506::step() {
 	case 95:
 		_game._player._visible = true;
 		_game._player._stepEnabled = true;
-		_game.syncTimers(2, 0, 3, _globals._animationIndexes[1]);
+		_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]);
 		break;
 
 	default:
@@ -4062,7 +4062,7 @@ void Scene506::step() {
 		if ((curFrame == 141) && !_skipFl) {
 			_game._player._visible = true;
 			_skipFl = true;
-			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
 		}
 
 		if (curFrame == 240)
@@ -4115,7 +4115,7 @@ void Scene506::actions() {
 			break;
 
 		case 2:
-			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[4]);
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]);
 			_game._player._visible = true;
 			_scene->_sequences.addTimer(20, 3);
 			break;
@@ -4189,7 +4189,7 @@ void Scene506::actions() {
 				_game._player._visible = false;
 				_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 5, 1);
 				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2);
-				_game.syncTimers(1, _globals._sequenceIndexes[7], 2, 0);
+				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[7], SYNC_PLAYER, 0);
 				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
 				break;
 
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index 479a042..50b37de 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -569,7 +569,7 @@ void SequenceList::setSeqPlayer(int idx, bool flag) {
 	setScale(idx, player._currentScale);
 
 	if (flag)
-		_vm->_game->syncTimers(1, idx, 2, 0);
+		_vm->_game->syncTimers(SYNC_SEQ, idx, SYNC_PLAYER, 0);
 }
 
 } // End of namespace


Commit: a475a7f18a221d5e9f31ec380bfe2a828b8537e2
    https://github.com/scummvm/scummvm/commit/a475a7f18a221d5e9f31ec380bfe2a828b8537e2
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-13T11:36:04+01:00

Commit Message:
MADS: Rex: Use a constant when checking _mainObjectSource

Changed paths:
    engines/mads/nebular/nebular_scenes1.cpp
    engines/mads/nebular/nebular_scenes2.cpp
    engines/mads/nebular/nebular_scenes3.cpp
    engines/mads/nebular/nebular_scenes5.cpp
    engines/mads/nebular/nebular_scenes6.cpp
    engines/mads/nebular/nebular_scenes7.cpp



diff --git a/engines/mads/nebular/nebular_scenes1.cpp b/engines/mads/nebular/nebular_scenes1.cpp
index d5e1fc0..c33ce7f 100644
--- a/engines/mads/nebular/nebular_scenes1.cpp
+++ b/engines/mads/nebular/nebular_scenes1.cpp
@@ -1263,7 +1263,7 @@ void Scene102::actions() {
 		return;
 	}
 
-	if (_action.isAction(VERB_LOOK, NOUN_BURGER) && (_action._mainObjectSource == 4)) {
+	if (_action.isAction(VERB_LOOK, NOUN_BURGER) && (_action._mainObjectSource == CAT_HOTSPOT)) {
 		_vm->_dialogs->show(801);
 		_action._inProgress = false;
 	}
@@ -2295,7 +2295,7 @@ void Scene107::actions() {
 		_scene->_nextSceneId = 105;
 	else if (_action.isAction(VERB_LOOK, NOUN_NORTHERN_SEA_CLIFF))
 		_vm->_dialogs->show(10701);
-	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH) && (_action._mainObjectSource == 4))
+	else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(10702);
 	else if (_action.isAction(VERB_LOOK, NOUN_BUSH_LIKE_FORMATION))
 		_vm->_dialogs->show(10703);
diff --git a/engines/mads/nebular/nebular_scenes2.cpp b/engines/mads/nebular/nebular_scenes2.cpp
index ad15f83..7349677 100644
--- a/engines/mads/nebular/nebular_scenes2.cpp
+++ b/engines/mads/nebular/nebular_scenes2.cpp
@@ -1405,9 +1405,9 @@ void Scene205::actions() {
 			_vm->_dialogs->show(20503);
 		else if (_action.isAction(VERB_LOOK, NOUN_HUT))
 			_vm->_dialogs->show(20504);
-		else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN) && (_action._mainObjectSource == 4))
+		else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT))
 			_vm->_dialogs->show(20505);
-		else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN) && (_action._mainObjectSource == 4))
+		else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT))
 			_vm->_dialogs->show(20506);
 		else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN_ON_SPIT))
 			_vm->_dialogs->show(20507);
diff --git a/engines/mads/nebular/nebular_scenes3.cpp b/engines/mads/nebular/nebular_scenes3.cpp
index 4056035..f9513b9 100644
--- a/engines/mads/nebular/nebular_scenes3.cpp
+++ b/engines/mads/nebular/nebular_scenes3.cpp
@@ -5045,7 +5045,7 @@ void Scene359::actions() {
 		_vm->_dialogs->show(35918);
 	else if (_action.isAction(VERB_TAKE, NOUN_LIMB))
 		_vm->_dialogs->show(35919);
-	else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_CARD) && (_action._mainObjectSource == 4))
+	else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_CARD) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(35921);
 	else if (_action.isAction(VERB_LOOK, NOUN_BLOOD_STAIN)) {
 		if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
diff --git a/engines/mads/nebular/nebular_scenes5.cpp b/engines/mads/nebular/nebular_scenes5.cpp
index 76eccf9..3778a59 100644
--- a/engines/mads/nebular/nebular_scenes5.cpp
+++ b/engines/mads/nebular/nebular_scenes5.cpp
@@ -2159,9 +2159,9 @@ void Scene511::actions() {
 			_vm->_dialogs->show(51128);
 	} else if (_action.isAction(VERB_LOOK, NOUN_PORTHOLE))
 		_vm->_dialogs->show(51122);
-	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == 4) && (_globals[kLineStatus] == 2))
+	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 2))
 		_vm->_dialogs->show(51126);
-	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == 4) && (_globals[kLineStatus] == 3))
+	else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 3))
 		_vm->_dialogs->show(51133);
 	else if (_action.isAction(VERB_LOOK, NOUN_STATUE))
 		_vm->_dialogs->show(51127);
diff --git a/engines/mads/nebular/nebular_scenes6.cpp b/engines/mads/nebular/nebular_scenes6.cpp
index 4fa1f77..7098566 100644
--- a/engines/mads/nebular/nebular_scenes6.cpp
+++ b/engines/mads/nebular/nebular_scenes6.cpp
@@ -684,7 +684,7 @@ void Scene603::actions() {
 			_vm->_dialogs->show(60327);
 		else
 			_vm->_dialogs->show(60328);
-	} else if (_action.isAction(VERB_LOOK, NOUN_COMPACT_CASE) && (_action._mainObjectSource == 4))
+	} else if (_action.isAction(VERB_LOOK, NOUN_COMPACT_CASE) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(60329);
 	// For the next two checks, the second part of the check wasn't surrounded par parenthesis, which was obviously wrong
 	else if (_action.isAction(VERB_LOOK) && (_action.isObject(NOUN_BRA) || _action.isObject(NOUN_BOA) || _action.isObject(NOUN_SLIP)))
@@ -2476,7 +2476,7 @@ void Scene608::actions() {
 			_vm->_dialogs->show(60824);
 	} else if (_action.isAction(VERB_OPEN, NOUN_STORAGE_BOX))
 		_vm->_dialogs->show(60826);
-	else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR) && (_action._mainObjectSource == 4))
+	else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(60828);
 	else if (_action.isAction(VERB_LOOK, NOUN_TOOL_BOX)) {
 		if (_game._objects[OBJ_POLYCEMENT]._roomNumber == _scene->_currentSceneId)
@@ -3014,7 +3014,7 @@ void Scene610::actions() {
 		_vm->_dialogs->show(61024);
 	else if (_action.isAction(VERB_LOOK, NOUN_SPOTLIGHT))
 		_vm->_dialogs->show(61025);
-	else if (_action.isAction(VERB_LOOK, NOUN_PHONE_HANDSET) && (_action._mainObjectSource == 4))
+	else if (_action.isAction(VERB_LOOK, NOUN_PHONE_HANDSET) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(61026);
 	else if (_action.isAction(VERB_LOOK, NOUN_PHONE_CRADLE))
 		_vm->_dialogs->show(61027);
diff --git a/engines/mads/nebular/nebular_scenes7.cpp b/engines/mads/nebular/nebular_scenes7.cpp
index 58280a7..6caebb7 100644
--- a/engines/mads/nebular/nebular_scenes7.cpp
+++ b/engines/mads/nebular/nebular_scenes7.cpp
@@ -498,7 +498,7 @@ void Scene702::actions() {
 		_game._player._stepEnabled = false;
 		_game._player._visible = false;
 		_scene->_nextSceneId = 711;
-	} else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == 4) && (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
+	} else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT) && (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
 		switch (_game._trigger) {
 		case 0:
 			_game._player._stepEnabled = false;
@@ -537,9 +537,9 @@ void Scene702::actions() {
 		_vm->_dialogs->show(70215);
 	else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
 		_vm->_dialogs->show(70216);
-	else if (_action.isAction(VERB_LOOK, NOUN_BONES) && (_action._mainObjectSource == 4))
+	else if (_action.isAction(VERB_LOOK, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(70217);
-	else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == 4)) {
+	else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT)) {
 		if (_game._objects.isInInventory(OBJ_BONES))
 			_vm->_dialogs->show(70219);
 	} else if (_action.isAction(VERB_LOOK, NOUN_SUBMERGED_CITY))
@@ -1455,7 +1455,7 @@ void Scene704::actions() {
 			_vm->_dialogs->show(70412);
 	} else if (_action.isAction(VERB_LOOK, NOUN_VOLCANO_RIM))
 		_vm->_dialogs->show(70413);
-	else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == 4))
+	else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(70414);
 	else if (_action.isAction(VERB_LOOK, NOUN_OPEN_WATER_TO_SOUTH))
 		_vm->_dialogs->show(70416);
@@ -2017,7 +2017,7 @@ void Scene706::actions() {
 		_vm->_dialogs->show(70623);
 	else if (_action.isAction(VERB_LOOK, NOUN_VASE) && (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId))
 		_vm->_dialogs->show(70624);
-	else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == 4))
+	else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == CAT_HOTSPOT))
 		_vm->_dialogs->show(70632);
 	else
 		return;


Commit: ed0e6d19f82a270d061f788f990fa465fe1d3474
    https://github.com/scummvm/scummvm/commit/ed0e6d19f82a270d061f788f990fa465fe1d3474
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-13T12:17:30+01:00

Commit Message:
MADS: Dragon: Implement scene 105

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes.cpp
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/dragonsphere/dragonsphere_scenes1.h



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
index b43f7af..938931e 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
@@ -51,7 +51,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
 	case 104:	// fireplace / bookshelf
 		return new Scene104(vm);
 	case 105:	// dining room
-		return new DummyScene(vm);	// TODO
+		return new Scene105(vm);
 	case 106:	// throne room
 		return new DummyScene(vm);	// TODO
 	case 107:	// council chamber
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 0788fe6..7787054 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -3096,5 +3096,619 @@ void Scene104::handlePidAnimation() {
 }
 /*------------------------------------------------------------------------*/
 
+Scene105::Scene105(MADSEngine *vm) : Scene1xx(vm) {
+	_maidTalkingFl = false;
+	_sitUpFl = false;
+	_goodNumberFl = false;
+
+	_maidFrame = -1;
+	_newStatus = -1;
+	_previousStatus = -1;
+	_maidHotspotId1 = -1;
+	_maidHotspotId2 = -1;
+	_bucketHotspotId = -1;
+	_boneHotspotId = -1;
+	_gobletHotspotId = -1;
+}
+
+void Scene105::synchronize(Common::Serializer &s) {
+	Scene1xx::synchronize(s);
+
+	s.syncAsByte(_maidTalkingFl);
+	s.syncAsByte(_sitUpFl);
+	s.syncAsByte(_goodNumberFl);
+
+	s.syncAsSint16LE(_maidFrame);
+	s.syncAsSint16LE(_newStatus);
+	s.syncAsSint16LE(_previousStatus);
+	s.syncAsSint16LE(_maidHotspotId1);
+	s.syncAsSint16LE(_maidHotspotId2);
+	s.syncAsSint16LE(_bucketHotspotId);
+	s.syncAsSint16LE(_boneHotspotId);
+	s.syncAsSint16LE(_gobletHotspotId);
+}
+
+void Scene105::setup() {
+	setPlayerSpritesPrefix();
+	setAAName();
+
+	_scene->addActiveVocab(NOUN_SCULLERY_MAID);
+	_scene->addActiveVocab(NOUN_BUCKET);
+	_scene->addActiveVocab(VERB_WALK_TO);
+	_scene->addActiveVocab(NOUN_BONE);
+	_scene->addActiveVocab(NOUN_GOBLET);
+}
+
+void Scene105::enter() {
+	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
+	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*KGRD_8");
+
+	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0);
+	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 3);
+
+	_maidHotspotId1 = _scene->_dynamicHotspots.add(NOUN_SCULLERY_MAID, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(189, 123, 189 + 25, 123 + 11));
+	_scene->_dynamicHotspots.setPosition(_maidHotspotId1, Common::Point(174, 151), FACING_NORTHEAST);
+	_scene->_dynamicHotspots[_maidHotspotId1]._articleNumber = PREP_ON;
+
+	_maidHotspotId2 = _scene->_dynamicHotspots.add(NOUN_SCULLERY_MAID, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(189, 134, 189 + 38, 134 + 9));
+	_scene->_dynamicHotspots.setPosition(_maidHotspotId2, Common::Point(174, 151), FACING_NORTHEAST);
+	_scene->_dynamicHotspots[_maidHotspotId2]._articleNumber = PREP_ON;
+
+	_bucketHotspotId = _scene->_dynamicHotspots.add(NOUN_BUCKET, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(176, 137, 176 + 10, 137 + 8));
+	_scene->_dynamicHotspots.setPosition(_bucketHotspotId, Common::Point(174, 151), FACING_NORTHEAST);
+
+	if (_game._objects.isInRoom(OBJ_GOBLET)) {
+		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 1));
+		_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM_6");
+		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
+		_gobletHotspotId = _scene->_dynamicHotspots.add(NOUN_GOBLET, VERB_WALK_TO, SYNTAX_SINGULAR, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6);
+		_scene->_dynamicHotspots.setPosition(_gobletHotspotId, Common::Point(63, 142), FACING_WEST);
+	}
+
+	if (_game._objects.isInRoom(OBJ_BONE)) {
+		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('p', 0));
+		_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRL_6");
+		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
+		_boneHotspotId = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALK_TO, SYNTAX_SINGULAR, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
+		_scene->_dynamicHotspots.setPosition(_boneHotspotId, Common::Point(255, 145), FACING_EAST);
+	}
+
+	_vm->_gameConv->get(2);
+	_newStatus = 1;
+	_previousStatus = 0;
+	_maidTalkingFl = false;
+	_sitUpFl = false;
+	_goodNumberFl = false;
+	_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 1);
+
+
+	if (_scene->_priorSceneId == 106) {
+		_game._player._playerPos = Common::Point(104, 152);
+		_game._player._facing = FACING_NORTHEAST;
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+	} else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 6);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+		_game._player.firstWalk(Common::Point(120, 96), FACING_SOUTH, Common::Point(117, 108), FACING_SOUTH, false);
+		_game._player.setWalkTrigger(70);
+	} else {
+		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1);
+		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+	}
+
+	sceneEntrySound();
+}
+
+void Scene105::step() {
+	if (_scene->_animation[_globals._animationIndexes[0]]) {
+		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _maidFrame) {
+			_maidFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+			int resetFrame = -1;
+
+			if (_sitUpFl && !_maidTalkingFl) {
+				_previousStatus = _newStatus;
+				_newStatus = 4;
+			}
+
+			if (_maidTalkingFl) {
+				_previousStatus = _newStatus;
+				_newStatus = 5;
+			}
+
+			switch (_maidFrame) {
+			case 16:
+				if (_newStatus == 1) {
+					_goodNumberFl = false;
+					while (!_goodNumberFl)
+						setRandomStatus();
+				}
+
+				if (_newStatus == 1)
+					resetFrame = 1;
+				else if ((_newStatus == 3 && !_sitUpFl) || _newStatus == 4)
+					resetFrame = 53;
+				else if ((_newStatus == 3) && (_sitUpFl))
+					resetFrame = 24;
+				break;
+
+			case 24:
+				if (_newStatus == 2) {
+					_goodNumberFl = false;
+					while (!_goodNumberFl)
+						setRandomStatus();
+				}
+
+				if ((_newStatus == 3) || (_newStatus == 5))
+					resetFrame = 53;
+				else if (_newStatus == 1)
+					resetFrame = 56;
+				else if (_newStatus == 4)
+					resetFrame = 53;
+
+				break;
+
+			case 32:
+				if (_newStatus == 3) {
+					_goodNumberFl = false;
+					while (!_goodNumberFl)
+						setRandomStatus();
+				}
+
+				if ((_newStatus == 1) || (_newStatus == 2))
+					resetFrame = 57;
+				else if (_newStatus == 4)
+					resetFrame = 55;
+				break;
+
+			case 53:
+				_maidTalkingFl = false;
+				_goodNumberFl = false;
+				while (!_goodNumberFl)
+					setRandomStatus();
+
+				if (_newStatus == 1)
+					resetFrame = 60;
+				else if (_newStatus == 2)
+					resetFrame = 57;
+				else if (_newStatus == 3)
+					resetFrame = 63;
+				else if (_newStatus == 4)
+					resetFrame = 55;
+				break;
+
+			case 56:
+				if (_newStatus == 4) {
+					_goodNumberFl = false;
+					while (!_goodNumberFl)
+						setRandomWipebrow();
+				}
+
+				if (_newStatus == 4)
+					resetFrame = 55;
+				else if (_newStatus == 5)
+					resetFrame = 32;
+				else if (_newStatus == 3)
+					resetFrame = 24;
+				break;
+
+			case 57:
+				if (_newStatus == 1)
+					resetFrame = 1;
+				break;
+
+			case 60:
+				if (_newStatus == 1)
+					resetFrame = 1;
+				else if (_newStatus == 2)
+					resetFrame = 16;
+				break;
+
+			case 63:
+				if (_newStatus == 1)
+					resetFrame = 1;
+				break;
+
+			case 64:
+				resetFrame = 24;
+				break;
+
+			default:
+				break;
+			}
+
+			if ((resetFrame >= 0) && (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame())) {
+				_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+				_maidFrame = resetFrame;
+			}
+		}
+	}
+
+	if (_game._trigger >= 70) {
+		switch (_game._trigger) {
+		case 70:
+			_scene->deleteSequence(_globals._sequenceIndexes[3]);
+			_vm->_sound->command(25);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+			break;
+
+		case 71: {
+			int seqIdx = _globals._sequenceIndexes[3];
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx);
+			_game._player._stepEnabled = true;
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+}
+
+void Scene105::actions() {
+	if (_action._lookFlag) {
+		_vm->_dialogs->show(10501);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_vm->_gameConv->_running == 2) {
+		handleConversation();
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) {
+		switch (_game._trigger) {
+		case 0:
+			_game._player._stepEnabled = false;
+			_game._player._visible = false;
+			_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 8, 2);
+			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4],true);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+			break;
+
+		case 1:
+			_scene->deleteSequence(_globals._sequenceIndexes[3]);
+			_vm->_sound->command(24);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+			break;
+
+		case 2: {
+			int seqIdx = _globals._sequenceIndexes[3];
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx);
+			}
+			break;
+
+		case 3:
+			_game._player._visible = true;
+			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]);
+			_scene->_sequences.addTimer(1,4);
+			break;
+
+		case 4:
+			_game._player.walk(Common::Point(120, 96), FACING_NORTH);
+			_game._player.setWalkTrigger(5);
+			break;
+
+		case 5:
+			_scene->deleteSequence(_globals._sequenceIndexes[3]);
+			_vm->_sound->command(25);
+			_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 7, 1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
+			break;
+
+		case 6: {
+			int seqIdx = _globals._sequenceIndexes[3];
+			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1);
+			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx);
+			_scene->_sequences.addTimer(6, 7);
+			}
+			break;
+
+		case 7:
+			_scene->_nextSceneId = 103;
+			break;
+
+		default:
+			break;
+		}
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) {
+		_scene->_nextSceneId = 106;
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TALK_TO, NOUN_SCULLERY_MAID)) {
+		_vm->_gameConv->run(2);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_GOBLET)) {
+		if (_game._trigger || !_game._objects.isInInventory(OBJ_GOBLET)) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 6, 2);
+				_scene->_sequences.setAnimRange (_globals._sequenceIndexes[8], 1, 7);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 7, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+				break;
+
+			case 1:
+				_scene->deleteSequence (_globals._sequenceIndexes[5]);
+				_scene->_dynamicHotspots.remove(_gobletHotspotId);
+				_vm->_sound->command(26);
+				_game._objects.addToInventory(OBJ_GOBLET);
+				_vm->_dialogs->showItem(OBJ_GOBLET, 10519, 0);
+				break;
+
+			case 2:
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
+				_globals[kPlayerScore] += 1;
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BONE) && _action._mainObjectSource == CAT_HOTSPOT) {
+		if (_game._trigger || !_game._objects.isInInventory(OBJ_BONE)) {
+			switch (_game._trigger) {
+			case 0:
+				_game._player._stepEnabled = false;
+				_game._player._visible = false;
+				_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 6, 2);
+				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+				break;
+
+			case 1:
+				_scene->deleteSequence (_globals._sequenceIndexes[6]);
+				_vm->_sound->command(26);
+				_scene->_dynamicHotspots.remove(_boneHotspotId);
+				_game._objects.addToInventory(OBJ_BONE);
+				_vm->_dialogs->showItem(OBJ_BONE, 10520, 0);
+				break;
+
+			case 2:
+				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]);
+				if (!(_globals[kPlayerScoreFlags] & 2048)) {
+					_globals[kPlayerScoreFlags] |= 2048;
+					_globals[kPlayerScore] += 1;
+				}
+				_game._player._visible = true;
+				_game._player._stepEnabled = true;
+				break;
+
+			default:
+				break;
+			}
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_BONE) && _game._objects.isInInventory(OBJ_BONE) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+		_vm->_dialogs->show(40112);
+		_action._inProgress = false;
+		return;
+	}
+
+	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
+
+		if (_action.isObject(NOUN_FLOOR)) {
+			_vm->_dialogs->show(10502);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BRAZIER)) {
+			_vm->_dialogs->show(10503);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DINING_TABLE)) {
+			if (_scene->_customDest.x <= 98) {
+				if (_game._objects[OBJ_GOBLET]._roomNumber == _scene->_currentSceneId)
+					_vm->_dialogs->show(10505);
+				else
+					_vm->_dialogs->show(10522);
+			} else
+				_vm->_dialogs->show(10504);
+
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CHAIR)) {
+			_vm->_dialogs->show(10507);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WINDOW)) {
+			_vm->_dialogs->show(10508);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_TAPESTRY)) {
+			_vm->_dialogs->show(10509);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) {
+			_vm->_dialogs->show(10511);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_WALL)) {
+			_vm->_dialogs->show(10512);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) {
+			_vm->_dialogs->show(10513);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_DIVIDING_WALL)) {
+			_vm->_dialogs->show(10514);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_CEILING)) {
+			_vm->_dialogs->show(10515);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SCULLERY_MAID)) {
+			_vm->_dialogs->show(10516);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_GOBLET) && _game._objects.isInRoom(OBJ_GOBLET)) {
+			_vm->_dialogs->show(10517);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BONE) && _game._objects.isInRoom(OBJ_BONE)) {
+			_vm->_dialogs->show(10518);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_SCONCE)) {
+			_vm->_dialogs->show(10524);
+			_action._inProgress = false;
+			return;
+		}
+
+		if (_action.isObject(NOUN_BUCKET)) {
+			_vm->_dialogs->show(10521);
+			_action._inProgress = false;
+			return;
+		}
+	}
+
+	if (_action.isAction(VERB_TAKE, NOUN_SCULLERY_MAID)) {
+		_vm->_dialogs->show(30);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_DINING_TABLE)) {
+		_vm->_dialogs->show(10506);
+		_action._inProgress = false;
+		return;
+	}
+
+	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TAPESTRY)) {
+		_vm->_dialogs->show(10510);
+		_action._inProgress = false;
+		return;
+	}
+}
+
+void Scene105::preActions() {
+	if (_action.isAction(VERB_TALK_TO, NOUN_SCULLERY_MAID))
+		_sitUpFl = true;
+}
+
+void Scene105::setRandomStatus() {
+	_previousStatus = _newStatus;
+	int rndVal = _vm->getRandomNumber(1, 30);
+	if (rndVal < 20) {
+		_newStatus = 1;
+		_goodNumberFl = true;
+	} else if ((rndVal > 19) && (rndVal < 27) && (_previousStatus != 2)) {
+		_newStatus = 2;
+		_goodNumberFl = true;
+	} else if (_previousStatus != 3) {
+		_newStatus = 3;
+		_goodNumberFl = true;
+	}
+}
+
+void Scene105::setRandomWipebrow() {
+	_previousStatus = _newStatus;
+
+	if (_vm->getRandomNumber(1, 100) < 100) {
+		_newStatus = 4;
+		_goodNumberFl = true;
+	} else if (_previousStatus != 3) {
+		_newStatus = 3;
+		_goodNumberFl = true;
+	}
+}
+
+void Scene105::handleConversation() {
+	if ((_action._activeAction._verbId == 0) && !_sitUpFl)
+		_sitUpFl = true;
+
+	if ((_action._activeAction._verbId == 1) || (_action._activeAction._verbId == 2)) {
+		switch (_game._trigger) {
+		case 0:
+			_vm->_gameConv->setInterlocutorTrigger(1);
+			break;
+
+		case 1:
+			_maidTalkingFl = true;
+			_sitUpFl = false;
+			_vm->_gameConv->setHeroTrigger(2);
+			break;
+
+		case 2:
+			_maidTalkingFl = false;
+			break;
+
+		default:
+			break;
+		}
+	}
+}
+
+/*------------------------------------------------------------------------*/
+
 } // End of namespace Dragonsphere
 } // End of namespace MADS
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h
index 9b56e84..fe51ed4 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.h
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.h
@@ -151,6 +151,37 @@ public:
 	virtual void preActions();
 	virtual void actions();
 };
+
+class Scene105 : public Scene1xx {
+private:
+	bool _maidTalkingFl;
+	bool _sitUpFl;
+	bool _goodNumberFl;
+
+	int _maidFrame;
+	int _maidHotspotId1;
+	int _maidHotspotId2;
+	int _newStatus;
+	int _previousStatus;
+	int _bucketHotspotId;
+	int _boneHotspotId;
+	int _gobletHotspotId;
+
+	void setRandomStatus();
+	void setRandomWipebrow();
+	void handleConversation();
+
+public:
+	Scene105(MADSEngine *vm);
+	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setup();
+	virtual void enter();
+	virtual void step();
+	virtual void preActions();
+	virtual void actions();
+};
+
 } // End of namespace Dragonsphere
 } // End of namespace MADS
 


Commit: 03fe7c6b86a0191845398284beb5d2daa3fc2eaa
    https://github.com/scummvm/scummvm/commit/03fe7c6b86a0191845398284beb5d2daa3fc2eaa
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-15T18:18:29+01:00

Commit Message:
MADS: Phantom: Merge _variant and _initialVariant

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/scene.cpp
    engines/mads/scene.h



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index 6142175..f3b599f 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -849,14 +849,14 @@ void Scene103::setup() {
 	setPlayerSpritesPrefix();
 	setAAName();
 
-	_scene->_initialVariant = 0;
+	_scene->_variant = 0;
 
 	if ((_globals[kPrompterStandStatus] == 1) || (_globals[kCurrentYear] == 1881)) {
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 		if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881))
-			_scene->_initialVariant = 2;
+			_scene->_variant = 2;
 		else if ((_globals[kJacquesStatus] >= 1) && (_globals[kCurrentYear] == 1881))
-			_scene->_initialVariant = 3;
+			_scene->_variant = 3;
 	}
 
 	_scene->addActiveVocab(NOUN_PROMPTERS_STAND);
@@ -902,7 +902,7 @@ void Scene103::enter() {
 	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
 	_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_6");
 
-	adjustRails(_scene->_initialVariant);
+	adjustRails(_scene->_variant);
 
 	_scene->_hotspots.activate(NOUN_JACQUES, false);
 	_scene->_hotspots.activate(NOUN_KEY, false);
@@ -2468,7 +2468,7 @@ void Scene104::setup() {
 	setAAName();
 
 	if (_globals[kTrapDoorStatus] == 1)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	_scene->addActiveVocab(NOUN_MONSIEUR_RICHARD);
 }
@@ -3613,7 +3613,7 @@ void Scene105::synchronize(Common::Serializer &s) {
 
 void Scene105::setup() {
 	if (_globals[kCurrentYear] == 1993)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	setPlayerSpritesPrefix();
 	setAAName();
@@ -4182,7 +4182,7 @@ void Scene106::synchronize(Common::Serializer &s) {
 
 void Scene106::setup() {
 	if (_globals[kCurrentYear] == 1881)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	setPlayerSpritesPrefix();
 	setAAName();
@@ -5042,7 +5042,7 @@ void Scene108::setup() {
 	setAAName();
 
 	if (_globals[kCurrentYear] == 1993)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	_scene->addActiveVocab(NOUN_GENTLEMAN);
 	_scene->addActiveVocab(NOUN_CHARLES);
@@ -6113,7 +6113,7 @@ void Scene110::synchronize(Common::Serializer &s) {
 
 void Scene110::setup() {
 	if (_globals[kCurrentYear] == 1993)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	setPlayerSpritesPrefix();
 	setAAName();
@@ -6476,7 +6476,7 @@ void Scene111::synchronize(Common::Serializer &s) {
 
 void Scene111::setup() {
 	if (_globals[kCurrentYear] == 1993)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	setPlayerSpritesPrefix();
 	setAAName();
@@ -9152,7 +9152,7 @@ void Scene114::synchronize(Common::Serializer &s) {
 
 void Scene114::setup() {
 	if (_globals[kCurrentYear] == 1993)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	setPlayerSpritesPrefix();
 	setAAName();
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 84cb4fa..22a26ee 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -618,7 +618,7 @@ void Scene202::setup() {
 	setAAName();
 
 	if (_globals[kTicketPeoplePresent] == 2)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	_scene->addActiveVocab(NOUN_CHANDELIER);
 	_scene->addActiveVocab(NOUN_EDGAR_DEGAS);
@@ -1536,7 +1536,7 @@ void Scene203::synchronize(Common::Serializer &s) {
 
 void Scene203::setup() {
 	if (_globals[kCurrentYear] == 1993)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	setPlayerSpritesPrefix();
 	setAAName();
@@ -3293,7 +3293,7 @@ void Scene204::synchronize(Common::Serializer &s) {
 
 void Scene204::setup() {
 	if ((_globals[kCurrentYear] == 1993) || _globals[kRightDoorIsOpen504])
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	setPlayerSpritesPrefix();
 	setAAName();
@@ -4240,12 +4240,12 @@ void Scene205::setup() {
 		return;
 
 	if (_globals[kJacquesStatus] == 1)
-		_scene->_initialVariant = 3;
+		_scene->_variant = 3;
 	else if (_globals[kJacquesStatus] == 0) {
 		if (_globals[kMadameGiryLocation] == 0)
-			_scene->_initialVariant = 2;
+			_scene->_variant = 2;
 		else if (_globals[kMadameGiryLocation] == 1)
-			_scene->_initialVariant = 1;
+			_scene->_variant = 1;
 	}
 }
 
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 3c7bae5..77ef155 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -2232,7 +2232,7 @@ void Scene309::setup() {
 	setAAName();
 
 	if (_globals[kRightDoorIsOpen504])
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 }
 
 void Scene309::enter() {
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index c9472ea..ece1f2b 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -86,7 +86,7 @@ void Scene401::setup() {
 	setAAName();
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_PUDDLE)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	_scene->addActiveVocab(NOUN_RED_FRAME);
 	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
@@ -580,10 +580,10 @@ void Scene403::setup() {
 	setAAName();
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_HOLE)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_PLANK)
-		_scene->_initialVariant = 2;
+		_scene->_variant = 2;
 
 	_scene->addActiveVocab(NOUN_RED_FRAME);
 	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
@@ -1079,7 +1079,7 @@ void Scene404::setup() {
 	setAAName();
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_BLOCK)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	_scene->addActiveVocab(NOUN_RED_FRAME);
 	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
@@ -2451,7 +2451,7 @@ void Scene408::setup() {
 	setAAName();
 
 	if ((_globals[kCatacombsMisc] & MAZE_EVENT_WEB) && (!_globals[kCobwebIsCut]))
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	_scene->addActiveVocab(NOUN_RED_FRAME);
 	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
@@ -4152,7 +4152,7 @@ void Scene453::setup() {
 	setAAName();
 
 	if (_globals[kCatacombsMisc] & MAZE_EVENT_STONE)
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	_scene->addActiveVocab(NOUN_RED_FRAME);
 	_scene->addActiveVocab(NOUN_YELLOW_FRAME);
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index dcc0a2e..c25dd18 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -3170,7 +3170,7 @@ void Scene505::setup() {
 	setAAName();
 
 	if ((_globals[kCoffinStatus] == 2) && (!_globals[kChrisLeft505]))
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 
 	_scene->addActiveVocab(NOUN_CHRISTINE);
 }
@@ -3928,7 +3928,7 @@ void Scene506::setup() {
 	_scene->addActiveVocab(VERB_LOOK_AT);
 
 	if (!_globals[kChristineIsInBoat])
-		_scene->_initialVariant = 1;
+		_scene->_variant = 1;
 }
 
 void Scene506::enter() {
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 01cea11..335f772 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -61,7 +61,6 @@ Scene::Scene(MADSEngine *vm)
 	_interfaceY = 0;
 	_spritesCount = 0;
 	_variant = 0;
-	_initialVariant = 0;
 
 	_speechReady = -1;
 
@@ -756,7 +755,6 @@ void Scene::synchronize(Common::Serializer &s) {
 	s.syncAsByte(_roomChanged);
 	s.syncAsUint16LE(_nextSceneId);
 	s.syncAsUint16LE(_priorSceneId);
-	s.syncAsSint16LE(_initialVariant);
 	s.syncAsSint16LE(_variant);
 	_dynamicHotspots.synchronize(s);
 }
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
index e1eee91..79e0fd4 100644
--- a/engines/mads/scene.h
+++ b/engines/mads/scene.h
@@ -98,7 +98,6 @@ public:
 	int _textSpacing;
 	Hotspots _hotspots;
 	DirtyAreas _dirtyAreas;
-	int _initialVariant;
 	int _variant;
 	SceneInfo *_sceneInfo;
 	MSurface _backgroundSurface;


Commit: ec3a4b994af521dd2f15c74d0aebcb4034157d9d
    https://github.com/scummvm/scummvm/commit/ec3a4b994af521dd2f15c74d0aebcb4034157d9d
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-16T00:31:09+01:00

Commit Message:
MADS: Some work on Camera

Changed paths:
    engines/mads/game.cpp
    engines/mads/game.h
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes3.cpp



diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index 7175007..5ffe3ec 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -58,7 +58,7 @@ Game *Game::init(MADSEngine *vm) {
 
 Game::Game(MADSEngine *vm)
 	: _vm(vm), _surface(nullptr), _objects(vm), _scene(vm),
-	  _screenObjects(vm), _player(vm) {
+	 _screenObjects(vm), _player(vm) {
 	_sectionNumber = 1;
 	_priorSectionNumber = 0;
 	_loadGameSlot = -1;
@@ -82,6 +82,7 @@ Game::Game(MADSEngine *vm)
 	_winStatus = 0;
 	_widepipeCtr = 0;
 	_fx = kTransitionNone;
+	_panningSpeed = 1; // Medium speed
 
 	// Load the inventory object list
 	_objects.load();
@@ -218,6 +219,10 @@ void Game::sectionLoop() {
 		}
 
 		_scene.loadScene(_scene._nextSceneId, _aaName, 0);
+		camInitDefault();
+		camSetSpeed();
+
+
 		_vm->_sound->pauseNewCommands();
 
 		if (!_player._spritesLoaded) {
@@ -640,10 +645,64 @@ void Game::syncTimers(SyncType slaveType, int slaveId, SyncType masterType, int
 }
 
 void Game::camPanTo(Camera *camera, int target) {
-	warning("TODO: Game::camPanTo");
-	if (camera) {
-		// Incomplete
-		camera->_panMode = 1;
+	if (!camera)
+		return;
+
+	if (camera->_panAllowedFl) {
+		camera->_activeFl = true;
+		camera->_manualFl = true;
+		camera->_target = target;
+		camera->_timer = _scene._frameStartTime;
 	}
 }
+
+void Game::camInitDefault() {
+	_camX._activeFl = false;
+	_camY._activeFl = false;
+
+	_camX._panAllowedFl = (_scene._sceneInfo->_width > MADS_SCREEN_WIDTH);
+	_camY._panAllowedFl = (_scene._sceneInfo->_height > MADS_SCENE_HEIGHT);
+
+	if (_camX._panAllowedFl) {
+		_camX._manualFl = false;
+		_camX._rate = 4;
+		_camX._speed = 4;
+		_camX._target = 0;
+		_camX._distOffCenter = 80;
+		_camX._startTolerance = 80;
+		_camX._endTolerance = 4;
+		_camX._timer = _scene._frameStartTime;
+	}
+
+	if (_camY._panAllowedFl) {
+		_camY._manualFl = true;
+		_camY._rate = 4;
+		_camY._speed = 2;
+		_camY._target = 0;
+		_camY._distOffCenter = 80;
+		_camY._startTolerance = 60;
+		_camY._endTolerance = 4;
+		_camY._timer = _scene._frameStartTime;
+	}
+}
+
+void Game::camSetSpeed() {
+	switch (_panningSpeed) {
+	case 1:
+		_camX._speed = 8;
+		_camY._speed = 4;
+		break;
+
+	case 2:
+		_camX._speed = 320;
+		_camY._speed = 160;
+		break;
+
+	default:
+		_camX._speed = 4;
+		_camY._speed = 2;
+		break;
+	}
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/game.h b/engines/mads/game.h
index c1cd4fd..fa6444a 100644
--- a/engines/mads/game.h
+++ b/engines/mads/game.h
@@ -147,6 +147,7 @@ public:
 	int _winStatus;
 	int _widepipeCtr;
 	int _loadGameSlot;
+	int _panningSpeed;
 
 public:
 	virtual ~Game();
@@ -244,13 +245,25 @@ public:
 	void syncTimers(SyncType slaveType, int slaveId, SyncType masterType, int masterId);
 
 	typedef struct {
-		//TODO
-		bool _panFrame;
-		int _panMode;
+		bool _panAllowedFl;
+		bool _activeFl;
+		bool _currentFrameFl;
+		bool _manualFl;
+
+		int _speed;
+		int _rate;
+		int _target;
+		int _distOffCenter;
+		int _startTolerance;
+		int _endTolerance;
+		int _direction;
+		uint32 _timer;
 	} Camera;
 	Camera _camX, _camY;
 
 	void camPanTo(Camera *camera, int target);
+	void camInitDefault();
+	void camSetSpeed();
 
 };
 
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 22a26ee..9a9f825 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -732,7 +732,7 @@ void Scene202::enter() {
 }
 
 void Scene202::step() {
-	if (_game._camX._panFrame)
+	if (_game._camX._currentFrameFl)
 		handleChandeliersPositions();
 
 	if (_anim0ActvFl)
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 77ef155..7047c4e 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -2601,7 +2601,7 @@ void Scene310::enter() {
 	_game._player._visible = false;
 	_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 80);
 	_scene->_animation[_globals._animationIndexes[0]]->_canChangeView = true;
-	_game._camX._panMode = 1;
+	_game._camX._manualFl = true;
 
 	_raoulMessageColor = 0x102;
 	_chrisMessageColor = 0x1110;


Commit: 9dc814e03ff82d0c98a055acbab40e65b8d7e57c
    https://github.com/scummvm/scummvm/commit/9dc814e03ff82d0c98a055acbab40e65b8d7e57c
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-16T10:35:52+01:00

Commit Message:
MADS: Implement some more Camera code

Changed paths:
    engines/mads/game.cpp
    engines/mads/game.h
    engines/mads/scene.cpp



diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index 5ffe3ec..607b7a4 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -705,4 +705,120 @@ void Game::camSetSpeed() {
 	}
 }
 
+void Game::camUpdate() {
+	bool any_pan = camPan(&_camX, &_scene._posAdjust.x, &_player._playerPos.x, 320, _scene._sceneInfo->_width);
+	any_pan |= camPan(&_camY, &_scene._posAdjust.y, &_player._playerPos.y, 156, _scene._sceneInfo->_height);
+
+	if (any_pan) {
+		_scene.setCamera(_scene._posAdjust);
+		_screenObjects._forceRescan = true;
+	}
+}
+
+bool Game::camPan(Camera *camera, int16 *picture_view, int16 *player_loc, int display_size, int picture_size) {
+	if (!camera)
+		return false;
+
+	bool panningFl = false;
+	if (camera->_panAllowedFl) {
+		camera->_currentFrameFl = false;
+
+		uint32 timer;
+		if ((abs((int32) (camera->_timer - _player._priorTimer)) < camera->_rate) && (_player._ticksAmount == camera->_rate))
+			timer = _player._priorTimer;
+		else
+			timer = camera->_timer;
+
+		if (camera->_activeFl && (_scene._frameStartTime < timer))
+			return (panningFl);
+
+		camera->_timer = _scene._frameStartTime + camera->_rate;
+
+		if (camera->_manualFl) {
+			if (camera->_activeFl) {
+				int diff = camera->_target - *picture_view;
+				int direction = 0;
+				if (diff < 0)
+					direction = -1;
+				else if (diff > 0)
+					direction = 1;
+
+				int magnitude = MIN(abs(diff), camera->_speed);
+
+				if (magnitude == 0)
+					camera->_activeFl = false;
+				else {
+					int panAmount;
+					if (direction < 0)
+						panAmount = -magnitude;
+					else
+						panAmount = magnitude;
+
+					*picture_view += panAmount;
+
+					panningFl = true;
+					camera->_currentFrameFl = true;
+				}
+			}
+		} else {
+			if (!camera->_activeFl) {
+				int lowEdge = *picture_view + camera->_startTolerance;
+				int highEdge = *picture_view - camera->_startTolerance + display_size - 1;
+
+				if ((*player_loc < lowEdge) && (picture_view > 0)) {
+					camera->_activeFl = true;
+					camera->_direction = -1;
+				}
+
+				if ((*player_loc > highEdge) && (*picture_view < (picture_size - display_size))) {
+					camera->_activeFl = true;
+					camera->_direction = 1;
+				}
+			}
+
+			int newTarget = *player_loc - (display_size >> 1);
+
+			if (camera->_direction < 0)
+				newTarget -= camera->_distOffCenter;
+			else 
+				newTarget += camera->_distOffCenter;
+
+			newTarget = MAX(0, newTarget);
+			newTarget = MIN(newTarget, (picture_size - display_size));
+
+			camera->_target = newTarget;
+
+			int diff = newTarget - *picture_view;
+			int magnitude = abs(diff);
+
+			int direction = 0;
+			if (diff < 0)
+				direction = -1;
+			else if (diff > 0)
+				direction = 1;
+
+			if (camera->_activeFl && (magnitude <= camera->_endTolerance))
+				camera->_activeFl = false;
+
+			if (camera->_activeFl) {
+				magnitude = MIN(magnitude, camera->_speed);
+
+				int panAmount;
+				if (direction < 0)
+					panAmount = -magnitude;
+				else
+					panAmount = magnitude;
+
+				if (panAmount) {
+					*picture_view += panAmount;
+					panningFl = true;
+					camera->_currentFrameFl = true;
+				}
+			}
+		}
+	}
+
+	return (panningFl);
+}
+
 } // End of namespace MADS
diff --git a/engines/mads/game.h b/engines/mads/game.h
index fa6444a..0579d94 100644
--- a/engines/mads/game.h
+++ b/engines/mads/game.h
@@ -264,6 +264,8 @@ public:
 	void camPanTo(Camera *camera, int target);
 	void camInitDefault();
 	void camSetSpeed();
+	void camUpdate();
+	bool camPan(Camera *camera, int16 *picture_view, int16 *player_loc, int display_size, int picture_size);
 
 };
 
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index 335f772..da62a63 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -390,6 +390,7 @@ void Scene::doFrame() {
 				!_vm->_game->_fx);
 	}
 
+	_vm->_game->camUpdate();
 	if (_action._selectedAction && player._stepEnabled && !player._needToWalk &&
 			!_vm->_game->_trigger && !player._trigger) {
 		_action.startAction();
@@ -789,6 +790,7 @@ void Scene::setDynamicAnim(int id, int anim_id, int segment) {
 
 void Scene::setCamera(Common::Point pos) {
 	_posAdjust = pos;
+	warning("setCamera: Incomplete function");
 }
 
 void Scene::drawToBackground(int spriteId, int frameId, Common::Point pos, int depth, int scale) {


Commit: b5bffa81bfd7f14868cbd9b707dace2b0c3c26e3
    https://github.com/scummvm/scummvm/commit/b5bffa81bfd7f14868cbd9b707dace2b0c3c26e3
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-16T19:15:20+01:00

Commit Message:
MADS: Fix header

Changed paths:
    engines/mads/dragonsphere/dragonsphere_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes2.cpp
    engines/mads/phantom/phantom_scenes3.cpp
    engines/mads/phantom/phantom_scenes3.h
    engines/mads/phantom/phantom_scenes4.cpp
    engines/mads/phantom/phantom_scenes4.h
    engines/mads/phantom/phantom_scenes5.cpp
    engines/mads/phantom/phantom_scenes5.h



diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
index 7787054..7abb460 100644
--- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index f3b599f..f42b3e6 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp
index 9a9f825..1590d06 100644
--- a/engines/mads/phantom/phantom_scenes2.cpp
+++ b/engines/mads/phantom/phantom_scenes2.cpp
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp
index 7047c4e..33d569d 100644
--- a/engines/mads/phantom/phantom_scenes3.cpp
+++ b/engines/mads/phantom/phantom_scenes3.cpp
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 48ca998..58f2a08 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp
index ece1f2b..618677b 100644
--- a/engines/mads/phantom/phantom_scenes4.cpp
+++ b/engines/mads/phantom/phantom_scenes4.cpp
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h
index eb3c1bd..5aece98 100644
--- a/engines/mads/phantom/phantom_scenes4.h
+++ b/engines/mads/phantom/phantom_scenes4.h
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index c25dd18..508f2b9 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -11,7 +11,7 @@
 
  * 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
+ * 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
diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h
index dc8a870..3347830 100644
--- a/engines/mads/phantom/phantom_scenes5.h
+++ b/engines/mads/phantom/phantom_scenes5.h
@@ -11,7 +11,7 @@
 
  * 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
+ * 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


Commit: 0b2c269d8685378a475fe8d80f9380956b86f62f
    https://github.com/scummvm/scummvm/commit/0b2c269d8685378a475fe8d80f9380956b86f62f
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-18T01:01:10+01:00

Commit Message:
MADS: Fix posAdjust in Animation::update for v2 games

Changed paths:
    engines/mads/animation.cpp



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index d2260da..429c566 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -466,16 +466,17 @@ void Animation::update() {
 	}
 
 	bool isV2 = (_vm->getGameID() != GType_RexNebular);
-	if (!isV2) {
+	if (isV2 && _canChangeView) {
 		// Handle any offset adjustment for sprites as of this frame
 		// FIXME: This doesn't work properly for Phantom scene 101
 		bool paChanged = false;
-		if (scene._posAdjust.x != misc._posAdjust.x) {
-			scene._posAdjust.x = misc._posAdjust.x;
+		if (getFramePosAdjust(_currentFrame).x != scene._posAdjust.x) {
+			scene._posAdjust.x = getFramePosAdjust(_currentFrame).x;
 			paChanged = true;
 		}
-		if (scene._posAdjust.y != misc._posAdjust.y) {
-			scene._posAdjust.y = misc._posAdjust.y;
+
+		if (getFramePosAdjust(_currentFrame).y != scene._posAdjust.y) {
+			scene._posAdjust.y = getFramePosAdjust(_currentFrame).y;
 			paChanged = true;
 		}
 


Commit: f0d17d2c061dd2d4648e501d8f0caf8fd3ad7f73
    https://github.com/scummvm/scummvm/commit/f0d17d2c061dd2d4648e501d8f0caf8fd3ad7f73
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-18T13:05:51+01:00

Commit Message:
MADS: Remove obsolete comment and add debug trace in animation code

Changed paths:
    engines/mads/animation.cpp



diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
index 429c566..605c63e 100644
--- a/engines/mads/animation.cpp
+++ b/engines/mads/animation.cpp
@@ -377,6 +377,7 @@ void Animation::loadFrame(int frameNumber) {
 		pt.x = _unkList[_unkIndex].x;
 		pt.y = _unkList[_unkIndex].y;
 		_unkIndex = 1 - _unkIndex;
+		warning("LoadFrame - Using unknown array");
 	}
 
 	if (drawFrame(spriteSet, pt, frameNumber))
@@ -468,7 +469,6 @@ void Animation::update() {
 	bool isV2 = (_vm->getGameID() != GType_RexNebular);
 	if (isV2 && _canChangeView) {
 		// Handle any offset adjustment for sprites as of this frame
-		// FIXME: This doesn't work properly for Phantom scene 101
 		bool paChanged = false;
 		if (getFramePosAdjust(_currentFrame).x != scene._posAdjust.x) {
 			scene._posAdjust.x = getFramePosAdjust(_currentFrame).x;


Commit: f4c13c2360bf2cf58f638515e641f221d4fecb21
    https://github.com/scummvm/scummvm/commit/f4c13c2360bf2cf58f638515e641f221d4fecb21
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-22T18:50:16+01:00

Commit Message:
NEWS: Add support for A:GoE

Changed paths:
    NEWS



diff --git a/NEWS b/NEWS
index 0d4e73a..803a1ce 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ For a more comprehensive changelog of the latest experimental code, see:
    - Added support for The Lost Files of Sherlock Holmes: The Case of the Serrated Scalpel.
    - Added support for The Lost Files of Sherlock Holmes: The Case of the Rose Tattoo.
    - Added support for Beavis and Butthead in Virtual Stupidity.
+   - Added support for Amazon: Guardians of Eden.
 
  General:
    - Updated Munt MT-32 emulation code to version 1.5.0.


Commit: cb0e9fd8867642be1a878f6d8e717436d30747d9
    https://github.com/scummvm/scummvm/commit/cb0e9fd8867642be1a878f6d8e717436d30747d9
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-22T19:11:51+01:00

Commit Message:
CREDITS: Add credits for Access engine

Changed paths:
    AUTHORS
    devtools/credits.pl
    gui/credits.h



diff --git a/AUTHORS b/AUTHORS
index 00a816f..d5fe940 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -62,6 +62,10 @@ ScummVM Team
        Oliver Kiehl                 - (retired)
        Ludvig Strigeus              - (retired)
 
+    Access:
+       Arnaud Boutonne
+       Paul Gilbert
+
     Avalanche:
        Peter Bozso
        Arnaud Boutonne
diff --git a/devtools/credits.pl b/devtools/credits.pl
index 831f87e..d4bc3c0 100755
--- a/devtools/credits.pl
+++ b/devtools/credits.pl
@@ -552,7 +552,12 @@ begin_credits("Credits");
 				add_person("Oliver Kiehl", "olki", "(retired)");
 				add_person("Ludvig Strigeus", "ludde", "(retired)");
 			end_section();
-			
+
+			begin_section("Access");
+				add_person("Arnaud Boutonné", "Strangerke", "");
+				add_person("Paul Gilbert", "dreammaster", "");
+			end_section();
+
 			begin_section("Avalanche");
 				add_person("Peter Bozsó", "uruk", "");
 				add_person("Arnaud Boutonné", "Strangerke", "");
diff --git a/gui/credits.h b/gui/credits.h
index d26f954..d20bf01 100644
--- a/gui/credits.h
+++ b/gui/credits.h
@@ -77,6 +77,11 @@ static const char *credits[] = {
 "C0""Ludvig Strigeus",
 "C2""(retired)",
 "",
+"C1""Access",
+"A0""Arnaud Boutonne",
+"C0""Arnaud Boutonn\351",
+"C0""Paul Gilbert",
+"",
 "C1""Avalanche",
 "A0""Peter Bozso",
 "C0""Peter Bozs\363",


Commit: 9bf4b797d4ccdb0210dd9cd1a88358581138cbe1
    https://github.com/scummvm/scummvm/commit/9bf4b797d4ccdb0210dd9cd1a88358581138cbe1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2015-11-22T13:25:45-05:00

Commit Message:
SHERLOCK: Remove deprecated decompression file

Changed paths:
  R engines/sherlock/decompress.cpp



diff --git a/engines/sherlock/decompress.cpp b/engines/sherlock/decompress.cpp
deleted file mode 100644
index 8e02da3..0000000
--- a/engines/sherlock/decompress.cpp
+++ /dev/null
@@ -1,128 +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 "sherlock/decompress.h"
-
-namespace Sherlock {
-
-/**
- * Decompresses an LZW compressed resource. If no outSize is specified, it will
- * decompress the entire resource. If, however, an explicit size is specified,
- * then it means we're already within a resource, and only want to decompress
- * part of it.
- */
-Common::SeekableReadStream *decompressLZ(Common::SeekableReadStream &source, int32 outSize) {
-	if (outSize == -1) {
-		source.seek(5);
-		outSize = source.readSint32LE();
-	}
-
-	byte lzWindow[4096];
-	uint16 lzWindowPos;
-	uint16 cmd;
-
-	byte *outBuffer = new byte[outSize];
-	byte *outBufferEnd = outBuffer + outSize;
-	Common::MemoryReadStream *outS = new Common::MemoryReadStream(outBuffer, outSize, DisposeAfterUse::YES);
-
-	memset(lzWindow, 0xFF, 0xFEE);
-	lzWindowPos = 0xFEE;
-	cmd = 0;
-
-	do {
-		cmd >>= 1;
-		if (!(cmd & 0x100))
-			cmd = source.readByte() | 0xFF00;
-
-		if (cmd & 1) {
-			byte literal = source.readByte();
-			*outBuffer++ = literal;
-			lzWindow[lzWindowPos] = literal;
-			lzWindowPos = (lzWindowPos + 1) & 0x0FFF;
-		} else {
-			int copyPos, copyLen;
-			copyPos = source.readByte();
-			copyLen = source.readByte();
-			copyPos = copyPos | ((copyLen & 0xF0) << 4);
-			copyLen = (copyLen & 0x0F) + 3;
-			while (copyLen--) {
-				byte literal = lzWindow[copyPos];
-				copyPos = (copyPos + 1) & 0x0FFF;
-				*outBuffer++ = literal;
-				lzWindow[lzWindowPos] = literal;
-				lzWindowPos = (lzWindowPos + 1) & 0x0FFF;
-			}
-		}
-	} while (outBuffer < outBufferEnd);
-
-	return outS;
-}
-
-
-/**
- * Decompresses a Rose Tattoo resource
- *
-Common::SeekableReadStream *decompress32(Common::SeekableReadStream &source, int32 outSize) {
-	if (outSize == -1) {
-		outSize = source.readSint32LE();
-	}
-
-	byte lzWindow[8192];
-	byte *outBuffer = new byte[outSize];
-	byte *outBufferEnd = outBuffer + outSize;
-	Common::MemoryReadStream *outS = new Common::MemoryReadStream(outBuffer, outSize, DisposeAfterUse::YES);
-
-	memset(lzWindow, 0xFF, 8192);
-	int lzWindowPos = 0xFEE;
-	int cmd = 0;
-
-	do {
-		cmd >>= 1;
-		if (!(cmd & 0x100))
-			cmd = source.readByte() | 0xFF00;
-
-		if (cmd & 1) {
-			byte literal = source.readByte();
-			*outBuffer++ = literal;
-			lzWindow[lzWindowPos] = literal;
-			lzWindowPos = (lzWindowPos + 1) & 0x0FFF;
-		} else {
-			int copyPos, copyLen;
-			copyPos = source.readByte();
-			copyLen = source.readByte();
-			copyPos = copyPos | ((copyLen & 0xF0) << 4);
-			copyLen = (copyLen & 0x0F) + 3;
-			while (copyLen--) {
-				byte literal = lzWindow[copyPos];
-				copyPos = (copyPos + 1) & 0x0FFF;
-				*outBuffer++ = literal;
-				lzWindow[lzWindowPos] = literal;
-				lzWindowPos = (lzWindowPos + 1) & 0x0FFF;
-			}
-		}
-	} while (outBuffer < outBufferEnd);
-
-	return outS;
-}
-*/
-
-} // namespace Sherlock


Commit: 71905b8ad96e383d9815c8475a6d2ad85bae47f6
    https://github.com/scummvm/scummvm/commit/71905b8ad96e383d9815c8475a6d2ad85bae47f6
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-22T19:50:12+01:00

Commit Message:
ACCESS: build the engine by default

Changed paths:
    engines/access/configure.engine



diff --git a/engines/access/configure.engine b/engines/access/configure.engine
index b1defce..0082430 100644
--- a/engines/access/configure.engine
+++ b/engines/access/configure.engine
@@ -1,3 +1,3 @@
 # This file is included from the main "configure" script
 # add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
-add_engine access "Access" no
+add_engine access "Access" yes


Commit: 0c7bde123b93f30939b3560e3117e1b13d27502e
    https://github.com/scummvm/scummvm/commit/0c7bde123b93f30939b3560e3117e1b13d27502e
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-22T20:03:06+01:00

Commit Message:
CREDITS: On demand of dreammaster, add m_kiewitz to Sherlock's credits

Changed paths:
    AUTHORS
    devtools/credits.pl
    gui/credits.h



diff --git a/AUTHORS b/AUTHORS
index d5fe940..8f814fd 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -203,6 +203,7 @@ ScummVM Team
 
     Sherlock:
        Paul Gilbert
+       Martin Kiewitz
 
     Sky:
        Robert Goeffringmann         - (retired)
diff --git a/devtools/credits.pl b/devtools/credits.pl
index d4bc3c0..f5d8542 100755
--- a/devtools/credits.pl
+++ b/devtools/credits.pl
@@ -721,6 +721,7 @@ begin_credits("Credits");
 
 			begin_section("Sherlock");
 				add_person("Paul Gilbert", "dreammaster", "");
+				add_person("Martin Kiewitz", "m_kiewitz", "");
 			end_section();
 
 			begin_section("Sky");
diff --git a/gui/credits.h b/gui/credits.h
index d20bf01..2e66a70 100644
--- a/gui/credits.h
+++ b/gui/credits.h
@@ -243,6 +243,7 @@ static const char *credits[] = {
 "",
 "C1""Sherlock",
 "C0""Paul Gilbert",
+"C0""Martin Kiewitz",
 "",
 "C1""Sky",
 "A0""Robert Goeffringmann",


Commit: d9e2943fe6962810ffccc6ae136d7092ac0bd4bf
    https://github.com/scummvm/scummvm/commit/d9e2943fe6962810ffccc6ae136d7092ac0bd4bf
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-11-23T00:41:07+02:00

Commit Message:
Merge pull request #626 from dreammaster/phantom

MADS: Return of the Phantom WIP

Changed paths:
  A engines/mads/conversations.cpp
  A engines/mads/conversations.h
  A engines/mads/dragonsphere/dragonsphere_scenes1.cpp
  A engines/mads/dragonsphere/dragonsphere_scenes1.h
  A engines/mads/dragonsphere/globals_dragonsphere.cpp
  A engines/mads/dragonsphere/globals_dragonsphere.h
  A engines/mads/phantom/phantom_scenes2.cpp
  A engines/mads/phantom/phantom_scenes2.h
  A engines/mads/phantom/phantom_scenes3.cpp
  A engines/mads/phantom/phantom_scenes3.h
  A engines/mads/phantom/phantom_scenes4.cpp
  A engines/mads/phantom/phantom_scenes4.h
  A engines/mads/phantom/phantom_scenes5.cpp
  A engines/mads/phantom/phantom_scenes5.h
    engines/mads/animation.cpp
    engines/mads/animation.h
    engines/mads/assets.h
    engines/mads/debugger.cpp
    engines/mads/debugger.h
    engines/mads/dialogs.h
    engines/mads/dragonsphere/dragonsphere_scenes.cpp
    engines/mads/dragonsphere/dragonsphere_scenes.h
    engines/mads/dragonsphere/game_dragonsphere.cpp
    engines/mads/dragonsphere/game_dragonsphere.h
    engines/mads/game.cpp
    engines/mads/game.h
    engines/mads/hotspots.cpp
    engines/mads/hotspots.h
    engines/mads/mads.cpp
    engines/mads/mads.h
    engines/mads/menu_views.cpp
    engines/mads/menu_views.h
    engines/mads/messages.cpp
    engines/mads/messages.h
    engines/mads/module.mk
    engines/mads/nebular/game_nebular.cpp
    engines/mads/nebular/nebular_scenes1.cpp
    engines/mads/nebular/nebular_scenes2.cpp
    engines/mads/nebular/nebular_scenes3.cpp
    engines/mads/nebular/nebular_scenes4.cpp
    engines/mads/nebular/nebular_scenes5.cpp
    engines/mads/nebular/nebular_scenes6.cpp
    engines/mads/nebular/nebular_scenes7.cpp
    engines/mads/nebular/nebular_scenes8.cpp
    engines/mads/palette.h
    engines/mads/phantom/game_phantom.cpp
    engines/mads/phantom/game_phantom.h
    engines/mads/phantom/globals_phantom.cpp
    engines/mads/phantom/globals_phantom.h
    engines/mads/phantom/phantom_scenes.cpp
    engines/mads/phantom/phantom_scenes.h
    engines/mads/phantom/phantom_scenes1.cpp
    engines/mads/phantom/phantom_scenes1.h
    engines/mads/player.cpp
    engines/mads/player.h
    engines/mads/rails.cpp
    engines/mads/rails.h
    engines/mads/scene.cpp
    engines/mads/scene.h
    engines/mads/scene_data.cpp
    engines/mads/screen.cpp
    engines/mads/sequence.cpp
    engines/mads/sequence.h
    engines/mads/sound.cpp
    engines/mads/sound.h
    engines/mads/user_interface.cpp
    engines/mads/user_interface.h





Commit: f9868255a959647c35c46454a4d4612971154fc9
    https://github.com/scummvm/scummvm/commit/f9868255a959647c35c46454a4d4612971154fc9
Author: Johannes Schickel (lordhoto at scummvm.org)
Date: 2015-11-22T23:53:23+01:00

Commit Message:
MADS: Fix compilation.

Changed paths:
    engines/mads/phantom/phantom_scenes3.h



diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h
index 58f2a08..9f58ad1 100644
--- a/engines/mads/phantom/phantom_scenes3.h
+++ b/engines/mads/phantom/phantom_scenes3.h
@@ -209,7 +209,7 @@ private:
 	int _boatFrame;
 	int _talkCount;
 
-	void Scene309::handleBoatAnimation();
+	void handleBoatAnimation();
 
 public:
 	Scene309(MADSEngine *vm);


Commit: 9dbaf8dd210041f0798acab4da1114ccbd58d7c9
    https://github.com/scummvm/scummvm/commit/9dbaf8dd210041f0798acab4da1114ccbd58d7c9
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2015-11-23T00:55:28+02:00

Commit Message:
NEWS: Mention the Raspberry Pi port

Changed paths:
    NEWS



diff --git a/NEWS b/NEWS
index 803a1ce..47a72da 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,9 @@ For a more comprehensive changelog of the latest experimental code, see:
    - Added support for Beavis and Butthead in Virtual Stupidity.
    - Added support for Amazon: Guardians of Eden.
 
+ New Ports:
+   - Added Raspberry Pi port.
+
  General:
    - Updated Munt MT-32 emulation code to version 1.5.0.
 


Commit: 9cf7d1ba608908c8a52d663e2bd894afe6b63df4
    https://github.com/scummvm/scummvm/commit/9cf7d1ba608908c8a52d663e2bd894afe6b63df4
Author: Torbjörn Andersson (eriktorbjorn at users.sourceforge.net)
Date: 2015-11-23T00:15:55+01:00

Commit Message:
MADS: Silence two GCC warnings

The other warnings will require some further investigation.

Changed paths:
    engines/mads/phantom/game_phantom.cpp



diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 7e61241..597d404 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -888,14 +888,14 @@ int GamePhantom::exitCatacombs(int dir) {
 	int scene = _globals[kCatacombsRoom];
 	assert ((scene < _catacombSize) && (dir < 4));
 	return (_catacombs[scene]._exit[dir]);
-};
+}
 
 void GamePhantom::moveCatacombs(int dir) {
 	assert(_globals[kCatacombsRoom] = CLIP(_globals[kCatacombsRoom], 0, _catacombSize));
 	assert(dir = CLIP(dir, 0, 3));
 
 	newCatacombRoom(_catacombs[_globals[kCatacombsRoom]]._fromDirection[dir], _catacombs[_globals[kCatacombsRoom]]._exit[dir]);
-};
+}
 
 void GamePhantom::newCatacombRoom(int toRoom, int fromExit) {
 	_globals[kCatacombsNextRoom] = toRoom;


Commit: a12516ee1890e9057b7ca521b7f94aafd0205ce1
    https://github.com/scummvm/scummvm/commit/a12516ee1890e9057b7ca521b7f94aafd0205ce1
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-23T00:28:15+01:00

Commit Message:
MADS: Phantom: Reword scene101::handleAnimation0 for consistency, remove some useless variables in scene113

Changed paths:
    engines/mads/phantom/phantom_scenes1.cpp



diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp
index f42b3e6..53bf117 100644
--- a/engines/mads/phantom/phantom_scenes1.cpp
+++ b/engines/mads/phantom/phantom_scenes1.cpp
@@ -419,78 +419,77 @@ void Scene101::handleConversation1() {
 }
 
 void Scene101::handleAnimation0() {
-	int resetFrame;
-
-	if (_scene->getAnimFrame(_globals._animationIndexes[0]) != _callingFrame) {
-		_callingFrame = _scene->getAnimFrame(_globals._animationIndexes[0]);
-		resetFrame = -1;
-		switch (_callingFrame) {
-		case 1:
-		case 9:
-		case 12:
-			if (_callingStatus == 1) {
-				if (_callingFrame == 9) {
-					if (_startWalking0Fl) {
-						resetFrame = 13;
-						_callingStatus = 3;
-					} else
-						_callingStatus = 2;
-				} else
-					resetFrame = 1;
-			}
-
-			if (_callingStatus == 0) {
-				if (_startWalking0Fl) {
-					resetFrame = 60;
-					_callingStatus = 3;
-				} else
-					resetFrame = 0;
-			}
+	if (_scene->getAnimFrame(_globals._animationIndexes[0]) == _callingFrame)
+		return;
 
-			if (_callingStatus == 2) {
+	_callingFrame = _scene->getAnimFrame(_globals._animationIndexes[0]);
+	int resetFrame = -1;
+	switch (_callingFrame) {
+	case 1:
+	case 9:
+	case 12:
+		if (_callingStatus == 1) {
+			if (_callingFrame == 9) {
 				if (_startWalking0Fl) {
 					resetFrame = 13;
 					_callingStatus = 3;
-				} else {
-					++_talkCounter;
-
-					if (_talkCounter < 18) {
-						if (_vm->getRandomNumber(1, 2) == 1)
-							resetFrame = 7;
-						else
-							resetFrame = 10;
-					} else {
-						resetFrame = 54;
-						_callingStatus = 0;
-					}
-				}
-			}
-			break;
-
-		case 53:
-			_anim0Running = false;
-			_scene->freeAnimation(0);
-			break;
+				} else
+					_callingStatus = 2;
+			} else
+				resetFrame = 1;
+		}
 
-		case 59:
+		if (_callingStatus == 0) {
 			if (_startWalking0Fl) {
 				resetFrame = 60;
 				_callingStatus = 3;
-			} else {
+			} else
 				resetFrame = 0;
-				_callingStatus = 0;
-			}
-			break;
+		}
 
-		case 66:
-			resetFrame = 24;
-			break;
+		if (_callingStatus == 2) {
+			if (_startWalking0Fl) {
+				resetFrame = 13;
+				_callingStatus = 3;
+			} else {
+				++_talkCounter;
+
+				if (_talkCounter < 18) {
+					if (_vm->getRandomNumber(1, 2) == 1)
+						resetFrame = 7;
+					else
+						resetFrame = 10;
+				} else {
+					resetFrame = 54;
+					_callingStatus = 0;
+				}
+			}
 		}
+		break;
+
+	case 53:
+		_anim0Running = false;
+		_scene->freeAnimation(0);
+		break;
 
-		if (resetFrame >= 0) {
-			_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
-			_callingFrame = resetFrame;
+	case 59:
+		if (_startWalking0Fl) {
+			resetFrame = 60;
+			_callingStatus = 3;
+		} else {
+			resetFrame = 0;
+			_callingStatus = 0;
 		}
+		break;
+
+	case 66:
+		resetFrame = 24;
+		break;
+	}
+
+	if (resetFrame >= 0) {
+		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+		_callingFrame = resetFrame;
 	}
 }
 
@@ -8866,8 +8865,6 @@ void Scene113::handleDeadConversation() {
 }
 
 void Scene113::handleFlorentConversation() {
-	int random;
-
 	switch (_action._activeAction._verbId) {
 	case 3:
 	case 4:
@@ -8930,15 +8927,13 @@ void Scene113::handleFlorentConversation() {
 	case 66:
 		if ((_florentStatus != 3) &&
 			(_florentStatus != 2)) {
-				random = _vm->getRandomNumber(1,5);
-				if (random == 1)
+				if (_vm->getRandomNumber(1, 5) == 1)
 					_florentStatus = 0;
 		}
 
 		if ((_raoulAction != 3) && (_raoulAction != 5) && (_raoulAction != 4) && (!_raoulStandingFl)) {
 			_raoulAction = 1;
-			random = _vm->getRandomNumber(1, 2);
-			if (random == 1)
+			if (_vm->getRandomNumber(1, 2) == 1)
 				_raoulAction = 2;
 		}
 		break;
@@ -9006,8 +9001,6 @@ void Scene113::handleFlorentConversation() {
 }
 
 void Scene113::handleLoveConversation() {
-	int random;
-
 	switch (_action._activeAction._verbId) {
 	case 1:
 	case 2:
@@ -9073,10 +9066,8 @@ void Scene113::handleLoveConversation() {
 
 			if (_raoulAction != 3) {
 				_raoulAction = 1;
-				random = _vm->getRandomNumber(1, 2);
-				if (random == 1) {
+				if (_vm->getRandomNumber(1, 2) == 1)
 					_raoulAction = 2;
-				}
 			}
 		}
 		break;


Commit: 767ce0ddc06ba1d499347f1bccc99d6892b87136
    https://github.com/scummvm/scummvm/commit/767ce0ddc06ba1d499347f1bccc99d6892b87136
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-23T00:28:17+01:00

Commit Message:
MADS: Reduce the scope of a variable in panTransition

Changed paths:
    engines/mads/screen.cpp



diff --git a/engines/mads/screen.cpp b/engines/mads/screen.cpp
index c9f5df8..90fbbe7 100644
--- a/engines/mads/screen.cpp
+++ b/engines/mads/screen.cpp
@@ -687,7 +687,6 @@ void ScreenSurface::panTransition(MSurface &newScreen, byte *palData, int entryS
 	int y1, y2;
 	int startX = 0;
 	int deltaX;
-	int xAt;
 	int loopStart;
 //	uint32 baseTicks, currentTicks;
 	byte paletteMap[256];
@@ -720,7 +719,7 @@ void ScreenSurface::panTransition(MSurface &newScreen, byte *palData, int entryS
 
 	loopStart = throughBlack == THROUGH_BLACK1 ? 0 : 1;
 	for (int loop = loopStart; loop < 2; ++loop) {
-		xAt = startX;
+		int xAt = startX;
 		for (int xCtr = 0; xCtr < size.x; ++xCtr, xAt += deltaX) {
 			if (!loop) {
 				fillRect(Common::Rect(xAt + destPos.x, y1 + destPos.y,


Commit: 92b63ca70a0367f1b5d900dc628861d3df77a158
    https://github.com/scummvm/scummvm/commit/92b63ca70a0367f1b5d900dc628861d3df77a158
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-23T01:07:28+01:00

Commit Message:
MADS: Phantom: reduce the scope of a variable

Changed paths:
    engines/mads/phantom/phantom_scenes5.cpp



diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp
index 508f2b9..2daaed9 100644
--- a/engines/mads/phantom/phantom_scenes5.cpp
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -1495,8 +1495,6 @@ void Scene502::getPanelInfo(Common::Point *walkToPos, int *panel, Common::Point
 }
 
 void Scene502::handlePanelAnimation() {
-	int puzzleSolvedFl = true;
-
 	switch (_game._trigger) {
 	case 110:
 		_vm->_sound->command(65);
@@ -1748,6 +1746,7 @@ void Scene502::handlePanelAnimation() {
 			break;
 		}
 
+		int puzzleSolvedFl = true;
 		for (int i = 0; i < 16; i++) {
 			if (_puzzlePictures[i] != 1)
 				puzzleSolvedFl = false;


Commit: bebfb0df450dd76f1ab6b5f828f6a418123d093f
    https://github.com/scummvm/scummvm/commit/bebfb0df450dd76f1ab6b5f828f6a418123d093f
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-23T01:08:39+01:00

Commit Message:
MADS: Rex: Remove dead code in doObjectAction

(same check earlier in the same if statement)

Changed paths:
    engines/mads/nebular/game_nebular.cpp



diff --git a/engines/mads/nebular/game_nebular.cpp b/engines/mads/nebular/game_nebular.cpp
index 5526845..c4b7f57 100644
--- a/engines/mads/nebular/game_nebular.cpp
+++ b/engines/mads/nebular/game_nebular.cpp
@@ -693,8 +693,6 @@ void GameNebular::doObjectAction() {
 			_globals[kHandsetCellStatus] = _difficulty != DIFFICULTY_HARD || _globals[kHandsetCellStatus] ? 1 : 2;
 			dialogs.show(425);
 		}
-	} else if (action.isAction(VERB_SET, NOUN_TIMEBOMB)) {
-		dialogs.show(427);
 	} else if (action.isAction(VERB_PUT, NOUN_BOMB, NOUN_CHICKEN) || action.isAction(VERB_PUT, NOUN_BOMBS, NOUN_CHICKEN)) {
 		_objects.setRoom(OBJ_CHICKEN, NOWHERE);
 		if (_objects.isInInventory(OBJ_BOMBS)) {


Commit: 0dbf4e53c69ccebacde849d134fb94aca6217ef0
    https://github.com/scummvm/scummvm/commit/0dbf4e53c69ccebacde849d134fb94aca6217ef0
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-23T01:23:37+01:00

Commit Message:
MADS: Silent another cppCheck warning

Changed paths:
    engines/mads/resources.cpp



diff --git a/engines/mads/resources.cpp b/engines/mads/resources.cpp
index 3b7cf2c..16019a4 100644
--- a/engines/mads/resources.cpp
+++ b/engines/mads/resources.cpp
@@ -79,7 +79,7 @@ private:
 	 */
 	ResourceType getResourceType(const Common::String &resourceName) const;
 public:
-	HagArchive(MADSEngine *vm);
+	explicit HagArchive(MADSEngine *vm);
 	virtual ~HagArchive();
 
 	// Archive implementation


Commit: 1800f9d8dc26e177ac53be3e2cda0a5c19593dc0
    https://github.com/scummvm/scummvm/commit/1800f9d8dc26e177ac53be3e2cda0a5c19593dc0
Author: johndoe123 (john_doe at techie.com)
Date: 2015-11-23T13:22:51+01:00

Commit Message:
BBVS: Fix bug #6954: Pathfinding bug in Prison

The bug was caused by a check introduced by me to avoid division-by-zero errors
when the source and dest x values are equal.
This had the side effect that it didn't work well in this case outlined in the
bug report, maybe also in other places.
I'm not sure how to handle a DBZ correctly here so I'm setting the x delta to
1.0 if it would normally be 0.0, which seems to work after walking around
in some scenes.

Changed paths:
    engines/bbvs/walk.cpp



diff --git a/engines/bbvs/walk.cpp b/engines/bbvs/walk.cpp
index 5ef1410..e97182f 100644
--- a/engines/bbvs/walk.cpp
+++ b/engines/bbvs/walk.cpp
@@ -326,12 +326,10 @@ void BbvsEngine::canWalkToDest(WalkArea *walkArea, int infoCount) {
 }
 
 bool BbvsEngine::walkTestLineWalkable(const Common::Point &sourcePt, const Common::Point &destPt, WalkInfo *walkInfo) {
-	const float ptDeltaX = destPt.x - sourcePt.x;
+	const float ptDeltaX = MAX<float>(destPt.x - sourcePt.x, 1.0f);
 	const float ptDeltaY = destPt.y - sourcePt.y;
 	const float wDeltaX = walkInfo->x - sourcePt.x;
 	const float wDeltaY = walkInfo->y - sourcePt.y;
-	if (destPt.x == sourcePt.x)
-		return true;
 	if (walkInfo->direction) {
 		const float nDeltaY = wDeltaX * ptDeltaY / ptDeltaX + (float)sourcePt.y - (float)walkInfo->y;
 		return (nDeltaY >= 0.0f) && (nDeltaY < (float)walkInfo->delta);


Commit: 49a811c5fb8bc70daca1cca02e92e70c901154c3
    https://github.com/scummvm/scummvm/commit/49a811c5fb8bc70daca1cca02e92e70c901154c3
Author: Strangerke (strangerke at scummvm.org)
Date: 2015-11-23T14:36:54+01:00

Commit Message:
ACCESS: AGoE - Add detection for Spanish version, provided in bug #6958

Changed paths:
    engines/access/detection_tables.h



diff --git a/engines/access/detection_tables.h b/engines/access/detection_tables.h
index 124f5fc..9556cd9 100644
--- a/engines/access/detection_tables.h
+++ b/engines/access/detection_tables.h
@@ -40,6 +40,22 @@ static const AccessGameDescription gameDescriptions[] = {
 		0
 	},
 
+	{
+		// Amazon Guardians of Eden - Spanish
+		// Provided by dianiu in bug report #6958
+		{
+			"amazon",
+			0,
+			AD_ENTRY1s("c00.ap", "aeb429ff015596144c0df06886c84825", 303753),
+			Common::ES_ESP,
+			Common::kPlatformDOS,
+			ADGF_NO_FLAGS,
+			GUIO1(GUIO_NONE)
+		},
+		GType_Amazon,
+		0
+	},
+
 	// Amazon Guardians of Eden - Demo English
 	{
 		{






More information about the Scummvm-git-logs mailing list