[Scummvm-git-logs] scummvm master -> 4933b59e8e039ae346f650c044e5fe0ba6310ead

dreammaster dreammaster at scummvm.org
Sun Aug 28 20:40:13 CEST 2016


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

Summary:
4933b59e8e TITANIC: Implemented remaining game classes


Commit: 4933b59e8e039ae346f650c044e5fe0ba6310ead
    https://github.com/scummvm/scummvm/commit/4933b59e8e039ae346f650c044e5fe0ba6310ead
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2016-08-28T14:39:59-04:00

Commit Message:
TITANIC: Implemented remaining game classes

Changed paths:
    engines/titanic/carry/vision_centre.cpp
    engines/titanic/carry/vision_centre.h
    engines/titanic/core/turn_on_play_sound.cpp
    engines/titanic/core/turn_on_play_sound.h
    engines/titanic/core/turn_on_turn_off.cpp
    engines/titanic/core/turn_on_turn_off.h
    engines/titanic/game/placeholder/tv_on_bar.cpp
    engines/titanic/game/placeholder/tv_on_bar.h
    engines/titanic/game/sgt/sgt_nav.cpp
    engines/titanic/game/sgt/sgt_nav.h
    engines/titanic/game/sgt/toilet.cpp
    engines/titanic/game/sgt/toilet.h
    engines/titanic/game/sgt/vase.cpp
    engines/titanic/game/sgt/vase.h
    engines/titanic/game/sgt/washstand.cpp
    engines/titanic/game/sgt/washstand.h
    engines/titanic/game/third_class_canal.cpp
    engines/titanic/game/third_class_canal.h
    engines/titanic/game/throw_tv_down_well.cpp
    engines/titanic/game/throw_tv_down_well.h
    engines/titanic/game/titania_still_control.cpp
    engines/titanic/game/titania_still_control.h
    engines/titanic/game/tow_parrot_nav.cpp
    engines/titanic/game/tow_parrot_nav.h
    engines/titanic/game/up_lighter.cpp
    engines/titanic/game/up_lighter.h
    engines/titanic/game/useless_lever.cpp
    engines/titanic/game/useless_lever.h
    engines/titanic/game/wheel_button.cpp
    engines/titanic/game/wheel_button.h
    engines/titanic/game/wheel_hotspot.cpp
    engines/titanic/game/wheel_hotspot.h
    engines/titanic/game/wheel_spin.cpp
    engines/titanic/game/wheel_spin.h
    engines/titanic/gfx/chev_switch.cpp
    engines/titanic/gfx/toggle_button.h
    engines/titanic/gfx/toggle_switch.cpp
    engines/titanic/gfx/toggle_switch.h
    engines/titanic/messages/messages.h
    engines/titanic/moves/trip_down_canal.cpp
    engines/titanic/moves/trip_down_canal.h
    engines/titanic/npcs/true_talk_npc.cpp



diff --git a/engines/titanic/carry/vision_centre.cpp b/engines/titanic/carry/vision_centre.cpp
index 8c8bab1..fd30089 100644
--- a/engines/titanic/carry/vision_centre.cpp
+++ b/engines/titanic/carry/vision_centre.cpp
@@ -24,6 +24,12 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CVisionCentre, CBrain)
+	ON_MESSAGE(PuzzleSolvedMsg)
+	ON_MESSAGE(MouseButtonDownMsg)
+	ON_MESSAGE(MouseDragStartMsg)
+END_MESSAGE_MAP()
+
 void CVisionCentre::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CBrain::save(file, indent);
@@ -34,4 +40,27 @@ void CVisionCentre::load(SimpleFile *file) {
 	CBrain::load(file);
 }
 
+bool CVisionCentre::PuzzleSolvedMsg(CPuzzleSolvedMsg *msg) {
+	_fieldE0 = true;
+	return true;
+}
+
+bool CVisionCentre::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	if (_fieldE0) {
+		return CBrain::MouseButtonDownMsg(msg);
+	} else {
+		petDisplayMessage(1, "It would be nice if you could take that but you can't.");
+		return true;
+	}
+}
+
+bool CVisionCentre::MouseDragStartMsg(CMouseDragStartMsg *msg) {
+	if (_fieldE0) {
+		return CBrain::MouseDragStartMsg(msg);
+	} else {
+		petDisplayMessage(1, "It would be nice if you could take that but you can't.");
+		return true;
+	}
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/carry/vision_centre.h b/engines/titanic/carry/vision_centre.h
index 6cf8e2c..14055a5 100644
--- a/engines/titanic/carry/vision_centre.h
+++ b/engines/titanic/carry/vision_centre.h
@@ -28,6 +28,10 @@
 namespace Titanic {
 
 class CVisionCentre : public CBrain {
+	DECLARE_MESSAGE_MAP;
+	bool PuzzleSolvedMsg(CPuzzleSolvedMsg *msg);
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
+	bool MouseDragStartMsg(CMouseDragStartMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/core/turn_on_play_sound.cpp b/engines/titanic/core/turn_on_play_sound.cpp
index 2f9dba2..ab50b33 100644
--- a/engines/titanic/core/turn_on_play_sound.cpp
+++ b/engines/titanic/core/turn_on_play_sound.cpp
@@ -24,26 +24,37 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CTurnOnPlaySound, CTurnOnObject)
+	ON_MESSAGE(MouseButtonUpMsg)
+END_MESSAGE_MAP()
+
 CTurnOnPlaySound::CTurnOnPlaySound() : CTurnOnObject(), 
-		_string3("NULL"), _fieldF8(80), _fieldFC(0) {
+		_soundName("NULL"), _soundVolume(80), _soundVal3(0) {
 }
 
 void CTurnOnPlaySound::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeQuotedLine(_string3, indent);
-	file->writeNumberLine(_fieldF8, indent);
-	file->writeNumberLine(_fieldFC, indent);
+	file->writeQuotedLine(_soundName, indent);
+	file->writeNumberLine(_soundVolume, indent);
+	file->writeNumberLine(_soundVal3, indent);
 
 	CTurnOnObject::save(file, indent);
 }
 
 void CTurnOnPlaySound::load(SimpleFile *file) {
 	file->readNumber();
-	_string3 = file->readString();
-	_fieldF8 = file->readNumber();
-	_fieldFC = file->readNumber();
+	_soundName = file->readString();
+	_soundVolume = file->readNumber();
+	_soundVal3 = file->readNumber();
 
 	CTurnOnObject::load(file);
 }
 
+bool CTurnOnPlaySound::MouseButtonUpMsg(CMouseButtonUpMsg *msg) {
+	if (_soundName != "NULL")
+		playSound(_soundName, _soundVolume, _soundVal3);
+
+	return CTurnOnObject::MouseButtonUpMsg(msg);
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/core/turn_on_play_sound.h b/engines/titanic/core/turn_on_play_sound.h
index 1164135..29a25a5 100644
--- a/engines/titanic/core/turn_on_play_sound.h
+++ b/engines/titanic/core/turn_on_play_sound.h
@@ -28,10 +28,12 @@
 namespace Titanic {
 
 class CTurnOnPlaySound : public CTurnOnObject {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonUpMsg(CMouseButtonUpMsg *msg);
 private:
-	CString _string3;
-	int _fieldF8;
-	int _fieldFC;
+	CString _soundName;
+	int _soundVolume;
+	int _soundVal3;
 public:
 	CLASSDEF;
 	CTurnOnPlaySound();
diff --git a/engines/titanic/core/turn_on_turn_off.cpp b/engines/titanic/core/turn_on_turn_off.cpp
index d43ddf7..6498c22 100644
--- a/engines/titanic/core/turn_on_turn_off.cpp
+++ b/engines/titanic/core/turn_on_turn_off.cpp
@@ -24,16 +24,21 @@
 
 namespace Titanic {
 
-CTurnOnTurnOff::CTurnOnTurnOff() : CBackground(), _fieldE0(0),
-	_fieldE4(0), _fieldE8(0), _fieldEC(0), _fieldF0(0) {
+BEGIN_MESSAGE_MAP(CTurnOnTurnOff, CBackground)
+	ON_MESSAGE(TurnOn)
+	ON_MESSAGE(TurnOff)
+END_MESSAGE_MAP()
+
+CTurnOnTurnOff::CTurnOnTurnOff() : CBackground(), _startFrameOn(0),
+	_endFrameOn(0), _startFrameOff(0), _endFrameOff(0), _fieldF0(false) {
 }
 
 void CTurnOnTurnOff::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeNumberLine(_fieldE0, indent);
-	file->writeNumberLine(_fieldE4, indent);
-	file->writeNumberLine(_fieldE8, indent);
-	file->writeNumberLine(_fieldEC, indent);
+	file->writeNumberLine(_startFrameOn, indent);
+	file->writeNumberLine(_endFrameOn, indent);
+	file->writeNumberLine(_startFrameOff, indent);
+	file->writeNumberLine(_endFrameOff, indent);
 	file->writeNumberLine(_fieldF0, indent);
 
 	CBackground::save(file, indent);
@@ -41,13 +46,37 @@ void CTurnOnTurnOff::save(SimpleFile *file, int indent) {
 
 void CTurnOnTurnOff::load(SimpleFile *file) {
 	file->readNumber();
-	_fieldE0 = file->readNumber();
-	_fieldE4 = file->readNumber();
-	_fieldE8 = file->readNumber();
-	_fieldEC = file->readNumber();
+	_startFrameOn = file->readNumber();
+	_endFrameOn = file->readNumber();
+	_startFrameOff = file->readNumber();
+	_endFrameOff = file->readNumber();
 	_fieldF0 = file->readNumber();
 
 	CBackground::load(file);
 }
 
+bool CTurnOnTurnOff::TurnOn(CTurnOn *msg) {
+	if (!_fieldF0) {
+		if (_fieldDC)
+			playMovie(_startFrameOn, _endFrameOn, MOVIE_GAMESTATE);
+		else
+			playMovie(_startFrameOn, _endFrameOn, MOVIE_NOTIFY_OBJECT);
+		_fieldF0 = true;
+	}
+
+	return true;
+}
+
+bool CTurnOnTurnOff::TurnOff(CTurnOff *msg) {
+	if (!_fieldF0) {
+		if (_fieldDC)
+			playMovie(_startFrameOff, _endFrameOff, MOVIE_GAMESTATE);
+		else
+			playMovie(_startFrameOff, _endFrameOff, MOVIE_NOTIFY_OBJECT);
+		_fieldF0 = true;
+	}
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/core/turn_on_turn_off.h b/engines/titanic/core/turn_on_turn_off.h
index adca687..c09f0e0 100644
--- a/engines/titanic/core/turn_on_turn_off.h
+++ b/engines/titanic/core/turn_on_turn_off.h
@@ -28,12 +28,15 @@
 namespace Titanic {
 
 class CTurnOnTurnOff : public CBackground {
+	DECLARE_MESSAGE_MAP;
+	bool TurnOn(CTurnOn *msg);
+	bool TurnOff(CTurnOff *msg);
 private:
-	int _fieldE0;
-	int _fieldE4;
-	int _fieldE8;
-	int _fieldEC;
-	int _fieldF0;
+	int _startFrameOn;
+	int _endFrameOn;
+	int _startFrameOff;
+	int _endFrameOff;
+	bool _fieldF0;
 public:
 	CLASSDEF;
 	CTurnOnTurnOff();
diff --git a/engines/titanic/game/placeholder/tv_on_bar.cpp b/engines/titanic/game/placeholder/tv_on_bar.cpp
index e17fb78..710b5a3 100644
--- a/engines/titanic/game/placeholder/tv_on_bar.cpp
+++ b/engines/titanic/game/placeholder/tv_on_bar.cpp
@@ -24,16 +24,30 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CTVOnBar, CPlaceHolder)
+	ON_MESSAGE(VisibleMsg)
+END_MESSAGE_MAP()
+
 void CTVOnBar::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writePoint(_pos1, indent);
+	file->writePoint(_tvPos, indent);
 	CPlaceHolder::save(file, indent);
 }
 
 void CTVOnBar::load(SimpleFile *file) {
 	file->readNumber();
-	_pos1 = file->readPoint();
+	_tvPos = file->readPoint();
 	CPlaceHolder::load(file);
 }
 
+bool CTVOnBar::VisibleMsg(CVisibleMsg *msg) {
+	setVisible(msg->_visible);
+	if (msg->_visible)
+		setPosition(_tvPos);
+	else
+		setPosition(Point(0, 0));
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/placeholder/tv_on_bar.h b/engines/titanic/game/placeholder/tv_on_bar.h
index bb5381f..0157bc8 100644
--- a/engines/titanic/game/placeholder/tv_on_bar.h
+++ b/engines/titanic/game/placeholder/tv_on_bar.h
@@ -28,8 +28,10 @@
 namespace Titanic {
 
 class CTVOnBar : public CPlaceHolder {
+	DECLARE_MESSAGE_MAP;
+	bool VisibleMsg(CVisibleMsg *msg);
 private:
-	Point _pos1;
+	Point _tvPos;
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/sgt/sgt_nav.cpp b/engines/titanic/game/sgt/sgt_nav.cpp
index f98e486..c004f94 100644
--- a/engines/titanic/game/sgt/sgt_nav.cpp
+++ b/engines/titanic/game/sgt/sgt_nav.cpp
@@ -24,6 +24,11 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(SGTNav, CSGTStateRoom)
+	ON_MESSAGE(MouseButtonDownMsg)
+	ON_MESSAGE(MouseMoveMsg)
+END_MESSAGE_MAP()
+
 void SGTNav::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CSGTStateRoom::save(file, indent);
@@ -34,4 +39,43 @@ void SGTNav::load(SimpleFile *file) {
 	CSGTStateRoom::load(file);
 }
 
+bool SGTNav::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	CTurnOn onMsg;
+	CTurnOff offMsg;
+
+	if (_statics->_v6 == "Open" && _statics->_v1 == "Open") {
+		if (_statics->_v3 == "Open")
+			offMsg.execute("Vase");
+		if (_statics->_v4 == "Closed")
+			onMsg.execute("SGTTV");
+		if (_statics->_v7 == "Open")
+			offMsg.execute("Drawer");
+		if (_statics->_v8 == "Open")
+			offMsg.execute("Armchair");
+		if (_statics->_v9 == "Open")
+			offMsg.execute("Deskchair");
+		if (_statics->_v12 == "Open")
+			offMsg.execute("Toilet");
+
+		changeView("SGTState.Node 2.E");
+	} else if (_statics->_v1 == "Open") {
+		petDisplayMessage(1, "This is your stateroom. It is for sleeping. If you desire "
+			"entertainment or relaxation, please visit your local leisure lounge.");
+	} else if (_statics->_v6 == "Closed") {
+		petDisplayMessage(1, "The bed will not currently support your weight."
+			" We are working on this problem but are unlikely to be able to fix it.");
+	}
+
+	return true;
+}
+
+bool SGTNav::MouseMoveMsg(CMouseMoveMsg *msg) {
+	if (_statics->_v6 == "Open" && _statics->_v1 == "Open")
+		_cursorId = CURSOR_MOVE_FORWARD;
+	else
+		_cursorId = CURSOR_ARROW;
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/sgt/sgt_nav.h b/engines/titanic/game/sgt/sgt_nav.h
index 40fdc4e..78f6417 100644
--- a/engines/titanic/game/sgt/sgt_nav.h
+++ b/engines/titanic/game/sgt/sgt_nav.h
@@ -28,6 +28,9 @@
 namespace Titanic {
 
 class SGTNav : public CSGTStateRoom {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
+	bool MouseMoveMsg(CMouseMoveMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/sgt/toilet.cpp b/engines/titanic/game/sgt/toilet.cpp
index 799abd6..b8e87b6 100644
--- a/engines/titanic/game/sgt/toilet.cpp
+++ b/engines/titanic/game/sgt/toilet.cpp
@@ -24,6 +24,12 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CToilet, CSGTStateRoom)
+	ON_MESSAGE(TurnOn)
+	ON_MESSAGE(TurnOff)
+	ON_MESSAGE(MovieEndMsg)
+END_MESSAGE_MAP()
+
 void CToilet::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CSGTStateRoom::save(file, indent);
@@ -34,4 +40,42 @@ void CToilet::load(SimpleFile *file) {
 	CSGTStateRoom::load(file);
 }
 
+bool CToilet::TurnOn(CTurnOn *msg) {
+	if (CSGTStateRoom::_statics->_v12 == "Closed"
+			&& CSGTStateRoom::_statics->_v10 == "Open"
+			&& CSGTStateRoom::_statics->_v8 == "Closed") {
+		setVisible(true);
+		CSGTStateRoom::_statics->_v12 = "Open";
+
+		_fieldE0 = false;
+		_startFrame = 0;
+		_endFrame = 11;
+		playMovie(0, 11, MOVIE_GAMESTATE);
+		playSound("b#1.wav");
+	}
+
+	return true;
+}
+
+bool CToilet::TurnOff(CTurnOff *msg) {
+	if (CSGTStateRoom::_statics->_v12 == "Open") {
+		CSGTStateRoom::_statics->_v12 = "Closed";
+
+		_fieldE0 = true;
+		_startFrame = 11;
+		_endFrame = 18;
+		playMovie(11, 18, MOVIE_GAMESTATE);
+		playSound("b#1.wav");
+	}
+
+	return true;
+}
+
+bool CToilet::MovieEndMsg(CMovieEndMsg *msg) {
+	if (CSGTStateRoom::_statics->_v12 == "Closed")
+		setVisible(false);
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/sgt/toilet.h b/engines/titanic/game/sgt/toilet.h
index d87531a..a4bc318 100644
--- a/engines/titanic/game/sgt/toilet.h
+++ b/engines/titanic/game/sgt/toilet.h
@@ -28,6 +28,10 @@
 namespace Titanic {
 
 class CToilet : public CSGTStateRoom {
+	DECLARE_MESSAGE_MAP;
+	bool TurnOn(CTurnOn *msg);
+	bool TurnOff(CTurnOff *msg);
+	bool MovieEndMsg(CMovieEndMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/sgt/vase.cpp b/engines/titanic/game/sgt/vase.cpp
index 3e04b5d..2d37818 100644
--- a/engines/titanic/game/sgt/vase.cpp
+++ b/engines/titanic/game/sgt/vase.cpp
@@ -24,6 +24,12 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CVase, CSGTStateRoom)
+	ON_MESSAGE(TurnOn)
+	ON_MESSAGE(TurnOff)
+	ON_MESSAGE(MovieEndMsg)
+END_MESSAGE_MAP()
+
 void CVase::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CSGTStateRoom::save(file, indent);
@@ -34,4 +40,38 @@ void CVase::load(SimpleFile *file) {
 	CSGTStateRoom::load(file);
 }
 
+bool CVase::TurnOn(CTurnOn *msg) {
+	if (CSGTStateRoom::_statics->_v3 == "Closed") {
+		CSGTStateRoom::_statics->_v3 = "Open";
+		setVisible(true);
+		_fieldE0 = false;
+		_startFrame = 1;
+		_endFrame = 12;
+		playMovie(1, 12, MOVIE_GAMESTATE);
+	}
+
+	return true;
+}
+
+bool CVase::TurnOff(CTurnOff *msg) {
+	if (CSGTStateRoom::_statics->_v3 == "Open"
+			&& CSGTStateRoom::_statics->_v1 != "RestingV"
+			&& CSGTStateRoom::_statics->_v1 != "RestingUV") {
+		CSGTStateRoom::_statics->_v3 = "Closed";
+		_fieldE0 = true;
+		_startFrame = 12;
+		_endFrame = 25;
+		playMovie(12, 25, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+	}
+
+	return true;
+}
+
+bool CVase::MovieEndMsg(CMovieEndMsg *msg) {
+	if (CSGTStateRoom::_statics->_v3 == "Closed")
+		setVisible(false);
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/sgt/vase.h b/engines/titanic/game/sgt/vase.h
index 8aa35ac..e07d9ef 100644
--- a/engines/titanic/game/sgt/vase.h
+++ b/engines/titanic/game/sgt/vase.h
@@ -28,6 +28,10 @@
 namespace Titanic {
 
 class CVase : public CSGTStateRoom {
+	DECLARE_MESSAGE_MAP;
+	bool TurnOn(CTurnOn *msg);
+	bool TurnOff(CTurnOff *msg);
+	bool MovieEndMsg(CMovieEndMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/sgt/washstand.cpp b/engines/titanic/game/sgt/washstand.cpp
index 8127a59..afdc744 100644
--- a/engines/titanic/game/sgt/washstand.cpp
+++ b/engines/titanic/game/sgt/washstand.cpp
@@ -24,6 +24,12 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CWashstand, CSGTStateRoom)
+	ON_MESSAGE(TurnOn)
+	ON_MESSAGE(TurnOff)
+	ON_MESSAGE(MovieEndMsg)
+END_MESSAGE_MAP()
+
 void CWashstand::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CSGTStateRoom::save(file, indent);
@@ -34,4 +40,36 @@ void CWashstand::load(SimpleFile *file) {
 	CSGTStateRoom::load(file);
 }
 
+bool CWashstand::TurnOn(CTurnOn *msg) {
+	if (_statics->_v10 == "Closed" && _statics->_v2 == "NotOnWashstand") {
+		setVisible(true);
+		_statics->_v10 = "Open";
+		_fieldE0 = false;
+		_startFrame = 0;
+		_endFrame = 14;
+		playMovie(0, 14, MOVIE_GAMESTATE);
+		playSound("b#14.wav");
+	}
+
+	return true;
+}
+
+bool CWashstand::TurnOff(CTurnOff *msg) {
+	if (_statics->_v10 == "Open" && _statics->_v11 == "Closed"
+			&& _statics->_v12 == "Closed" && _statics->_v2 == "Open") {
+		_statics->_v10 = "Closed";
+		_fieldE0 = true;
+		_startFrame = 14;
+		_endFrame = 28;
+		playMovie(14, 28, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT);
+		playSound("b#14.wav");
+	}
+
+	return true;
+}
+
+bool CWashstand::MovieEndMsg(CMovieEndMsg *msg) {
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/sgt/washstand.h b/engines/titanic/game/sgt/washstand.h
index f140b17..1b72cfa 100644
--- a/engines/titanic/game/sgt/washstand.h
+++ b/engines/titanic/game/sgt/washstand.h
@@ -28,6 +28,10 @@
 namespace Titanic {
 
 class CWashstand : public CSGTStateRoom {
+	DECLARE_MESSAGE_MAP;
+	bool TurnOn(CTurnOn *msg);
+	bool TurnOff(CTurnOff *msg);
+	bool MovieEndMsg(CMovieEndMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/third_class_canal.cpp b/engines/titanic/game/third_class_canal.cpp
index 6b0a101..97b559e 100644
--- a/engines/titanic/game/third_class_canal.cpp
+++ b/engines/titanic/game/third_class_canal.cpp
@@ -24,6 +24,10 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CThirdClassCanal, CBackground)
+	ON_MESSAGE(MouseButtonDownMsg)
+END_MESSAGE_MAP()
+
 void CThirdClassCanal::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CBackground::save(file, indent);
@@ -34,4 +38,9 @@ void CThirdClassCanal::load(SimpleFile *file) {
 	CBackground::load(file);
 }
 
+bool CThirdClassCanal::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	petDisplayMessage("This area is off limits to passengers.");
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/third_class_canal.h b/engines/titanic/game/third_class_canal.h
index f6fc471..d0be8c0 100644
--- a/engines/titanic/game/third_class_canal.h
+++ b/engines/titanic/game/third_class_canal.h
@@ -28,6 +28,8 @@
 namespace Titanic {
 
 class CThirdClassCanal : public CBackground {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/throw_tv_down_well.cpp b/engines/titanic/game/throw_tv_down_well.cpp
index c8a9fc7..9de028c 100644
--- a/engines/titanic/game/throw_tv_down_well.cpp
+++ b/engines/titanic/game/throw_tv_down_well.cpp
@@ -24,18 +24,73 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CThrowTVDownWell, CGameObject)
+	ON_MESSAGE(ActMsg)
+	ON_MESSAGE(EnterViewMsg)
+	ON_MESSAGE(MovieEndMsg)
+	ON_MESSAGE(TimerMsg)
+	ON_MESSAGE(MovieFrameMsg)
+END_MESSAGE_MAP()
+
 void CThrowTVDownWell::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeQuotedLine(_strValue, indent);
-	file->writeNumberLine(_numValue, indent);
+	file->writeQuotedLine(_viewName, indent);
+	file->writeNumberLine(_flag, indent);
 	CGameObject::save(file, indent);
 }
 
 void CThrowTVDownWell::load(SimpleFile *file) {
 	file->readNumber();
-	_strValue = file->readString();
-	_numValue = file->readNumber();
+	_viewName = file->readString();
+	_flag = file->readNumber();
 	CGameObject::load(file);
 }
 
+bool CThrowTVDownWell::ActMsg(CActMsg *msg) {
+	if (msg->_action == "ThrowTVDownWell" && !_flag) {
+		CString viewName = getFullViewName();
+		lockMouse();
+		addTimer(1, 8000, 0);
+
+		CActMsg actMsg("ThrownTVDownWell");
+		actMsg.execute("BOWTelevisionMonitor");
+	}
+
+	return true;
+}
+
+bool CThrowTVDownWell::EnterViewMsg(CEnterViewMsg *msg) {
+	playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+	movieEvent(49);
+	return true;
+}
+
+bool CThrowTVDownWell::MovieEndMsg(CMovieEndMsg *msg) {
+	sleep(2000);
+	changeView("ParrotLobby.Node 11.N");
+	playSound("z#471.wav");
+	addTimer(2, 7000, 0);
+	return true;
+}
+
+bool CThrowTVDownWell::TimerMsg(CTimerMsg *msg) {
+	if (msg->_actionVal == 1) {
+		changeView("ParrotLobby.Node 10.N");
+	} else if (msg->_actionVal == 2) {
+		playSound("z#468.wav", 50);
+		sleep(1500);
+		changeView(_viewName);
+		_viewName = "NULL";
+		unlockMouse();
+		playSound("z#47.wav");
+	}
+
+	return true;
+}
+
+bool CThrowTVDownWell::MovieFrameMsg(CMovieFrameMsg *msg) {
+	playSound("z#470.wav");
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/throw_tv_down_well.h b/engines/titanic/game/throw_tv_down_well.h
index b6003aa..c9e8fd5 100644
--- a/engines/titanic/game/throw_tv_down_well.h
+++ b/engines/titanic/game/throw_tv_down_well.h
@@ -28,12 +28,18 @@
 namespace Titanic {
 
 class CThrowTVDownWell : public CGameObject {
+	DECLARE_MESSAGE_MAP;
+	bool ActMsg(CActMsg *msg);
+	bool EnterViewMsg(CEnterViewMsg *msg);
+	bool MovieEndMsg(CMovieEndMsg *msg);
+	bool TimerMsg(CTimerMsg *msg);
+	bool MovieFrameMsg(CMovieFrameMsg *msg);
 public:
-	CString _strValue;
-	int _numValue;
+	CString _viewName;
+	bool _flag;
 public:
 	CLASSDEF;
-	CThrowTVDownWell() : CGameObject(), _numValue(0) {}
+	CThrowTVDownWell() : CGameObject(), _flag(false) {}
 
 	/**
 	 * Save the data for the class to file
diff --git a/engines/titanic/game/titania_still_control.cpp b/engines/titanic/game/titania_still_control.cpp
index 67866ec..1ce0a85 100644
--- a/engines/titanic/game/titania_still_control.cpp
+++ b/engines/titanic/game/titania_still_control.cpp
@@ -24,6 +24,11 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CTitaniaStillControl, CGameObject)
+	ON_MESSAGE(SetFrameMsg)
+	ON_MESSAGE(VisibleMsg)
+END_MESSAGE_MAP()
+
 void CTitaniaStillControl::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CGameObject::save(file, indent);
@@ -34,4 +39,15 @@ void CTitaniaStillControl::load(SimpleFile *file) {
 	CGameObject::load(file);
 }
 
+bool CTitaniaStillControl::SetFrameMsg(CSetFrameMsg *msg) {
+	loadFrame(msg->_frameNumber);
+	setVisible(true);
+	return true;
+}
+
+bool CTitaniaStillControl::VisibleMsg(CVisibleMsg *msg) {
+	setVisible(false);
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/titania_still_control.h b/engines/titanic/game/titania_still_control.h
index 66c3045..b77227a 100644
--- a/engines/titanic/game/titania_still_control.h
+++ b/engines/titanic/game/titania_still_control.h
@@ -28,6 +28,9 @@
 namespace Titanic {
 
 class CTitaniaStillControl : public CGameObject {
+	DECLARE_MESSAGE_MAP;
+	bool SetFrameMsg(CSetFrameMsg *msg);
+	bool VisibleMsg(CVisibleMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/tow_parrot_nav.cpp b/engines/titanic/game/tow_parrot_nav.cpp
index 9361808..57f1649 100644
--- a/engines/titanic/game/tow_parrot_nav.cpp
+++ b/engines/titanic/game/tow_parrot_nav.cpp
@@ -21,9 +21,14 @@
  */
 
 #include "titanic/game/tow_parrot_nav.h"
+#include "titanic/npcs/parrot.h"
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CTOWParrotNav, CGameObject)
+	ON_MESSAGE(MouseButtonDownMsg)
+END_MESSAGE_MAP()
+
 void CTOWParrotNav::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CGameObject::save(file, indent);
@@ -34,4 +39,16 @@ void CTOWParrotNav::load(SimpleFile *file) {
 	CGameObject::load(file);
 }
 
+bool CTOWParrotNav::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	CActMsg actMsg("EnteringFromTOW");
+	actMsg.execute("PerchedParrot");
+
+	CString clipString = "_EXIT,36,1,N,9,3,N";
+	if (CParrot::_v4)
+		clipString += 'a';
+	changeView("ParrotLobby.Node 3.N", clipString);
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/tow_parrot_nav.h b/engines/titanic/game/tow_parrot_nav.h
index 17618ff..252d9b6 100644
--- a/engines/titanic/game/tow_parrot_nav.h
+++ b/engines/titanic/game/tow_parrot_nav.h
@@ -28,6 +28,8 @@
 namespace Titanic {
 
 class CTOWParrotNav : public CGameObject {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/up_lighter.cpp b/engines/titanic/game/up_lighter.cpp
index f03b8f3..d133a7e 100644
--- a/engines/titanic/game/up_lighter.cpp
+++ b/engines/titanic/game/up_lighter.cpp
@@ -21,9 +21,21 @@
  */
 
 #include "titanic/game/up_lighter.h"
+#include "titanic/core/project_item.h"
+#include "titanic/npcs/parrot.h"
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CUpLighter, CDropTarget)
+	ON_MESSAGE(MovieEndMsg)
+	ON_MESSAGE(PumpingMsg)
+	ON_MESSAGE(MouseButtonDownMsg)
+	ON_MESSAGE(EnterRoomMsg)
+	ON_MESSAGE(ChangeSeasonMsg)
+	ON_MESSAGE(TimerMsg)
+	ON_MESSAGE(LeaveRoomMsg)
+END_MESSAGE_MAP()
+
 CUpLighter::CUpLighter() : CDropTarget(), _field118(0),
 	_field11C(0), _field120(0), _field124(0) {
 }
@@ -48,8 +60,61 @@ void CUpLighter::load(SimpleFile *file) {
 	CDropTarget::load(file);
 }
 
+bool CUpLighter::MovieEndMsg(CMovieEndMsg *msg) {
+	if (_field118) {
+		playSound("z#47.wav");
+		_field124 = true;
+
+		CVisibleMsg visibleMsg(true);
+		visibleMsg.execute("NoseHolder");
+		CDropZoneLostObjectMsg lostMsg(nullptr);
+		lostMsg.execute(this);
+		_clipName.clear();
+		_itemMatchName = "Nothing";
+		_field118 = 0;
+	}
+
+	return true;
+}
+
+bool CUpLighter::PumpingMsg(CPumpingMsg *msg) {
+	_field118 = msg->_value;
+	_clipName = (_field118 && !_field124) ? "WholeSequence" : "HoseToNose";
+	return true;
+}
+
+bool CUpLighter::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	CTrueTalkTriggerActionMsg triggerMsg(280245, 0, 0);
+	triggerMsg.execute(getRoot(), CParrot::_type,
+		MSGFLAG_BREAK_IF_HANDLED | MSGFLAG_CLASS_DEF | MSGFLAG_SCAN);
+	return true;
+}
+
 bool CUpLighter::EnterRoomMsg(CEnterRoomMsg *msg) {
-	warning("CUpLighter::handleEvent");
+	_field11C = true;
+	addTimer(5000 + getRandomNumber(15000), 0);
+	return true;
+}
+
+bool CUpLighter::ChangeSeasonMsg(CChangeSeasonMsg *msg) {
+	_field120 = msg->_season == "Spring";
+	if (_field120)
+		addTimer(5000 + getRandomNumber(15000), 0);
+	return true;
+}
+
+bool CUpLighter::TimerMsg(CTimerMsg *msg) {
+	if (_field120 && _field11C & !_field118) {
+		CActMsg actMsg("Sneeze");
+		actMsg.execute(findRoom()->findByName("NoseHolder"));
+		addTimer(1000 + getRandomNumber(19000), 0);
+	}
+
+	return true;
+}
+
+bool CUpLighter::LeaveRoomMsg(CLeaveRoomMsg *msg) {
+	_field11C = false;
 	return true;
 }
 
diff --git a/engines/titanic/game/up_lighter.h b/engines/titanic/game/up_lighter.h
index 2367e41..e6a53cf 100644
--- a/engines/titanic/game/up_lighter.h
+++ b/engines/titanic/game/up_lighter.h
@@ -29,7 +29,14 @@
 namespace Titanic {
 
 class CUpLighter : public CDropTarget {
+	DECLARE_MESSAGE_MAP;
+	bool MovieEndMsg(CMovieEndMsg *msg);
+	bool PumpingMsg(CPumpingMsg *msg);
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
 	bool EnterRoomMsg(CEnterRoomMsg *msg);
+	bool ChangeSeasonMsg(CChangeSeasonMsg *msg);
+	bool TimerMsg(CTimerMsg *msg);
+	bool LeaveRoomMsg(CLeaveRoomMsg *msg);
 private:
 	int _field118;
 	int _field11C;
diff --git a/engines/titanic/game/useless_lever.cpp b/engines/titanic/game/useless_lever.cpp
index e48ad55..82d8983 100644
--- a/engines/titanic/game/useless_lever.cpp
+++ b/engines/titanic/game/useless_lever.cpp
@@ -24,6 +24,11 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CUselessLever, CToggleButton)
+	ON_MESSAGE(MouseButtonDownMsg)
+	ON_MESSAGE(EnterViewMsg)
+END_MESSAGE_MAP()
+
 void CUselessLever::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CToggleButton::save(file, indent);
@@ -34,4 +39,23 @@ void CUselessLever::load(SimpleFile *file) {
 	CToggleButton::load(file);
 }
 
+bool CUselessLever::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	if (_fieldE0) {
+		playMovie(15, 30, 0);
+		playSound("z#56.wav");
+		_fieldE0 = false;
+	} else {
+		playMovie(0, 14, 0);
+		playSound("z#56.wav");
+		_fieldE0 = true;
+	}
+
+	return true;
+}
+
+bool CUselessLever::EnterViewMsg(CEnterViewMsg *msg) {
+	loadFrame(_fieldE0 ? 15 : 0);
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/useless_lever.h b/engines/titanic/game/useless_lever.h
index 27397de..33ed94b 100644
--- a/engines/titanic/game/useless_lever.h
+++ b/engines/titanic/game/useless_lever.h
@@ -28,6 +28,9 @@
 namespace Titanic {
 
 class CUselessLever : public CToggleButton {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
+	bool EnterViewMsg(CEnterViewMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/wheel_button.cpp b/engines/titanic/game/wheel_button.cpp
index 19c42a8..d4a9f44 100644
--- a/engines/titanic/game/wheel_button.cpp
+++ b/engines/titanic/game/wheel_button.cpp
@@ -24,14 +24,20 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CWheelButton, CBackground)
+	ON_MESSAGE(SignalObject)
+	ON_MESSAGE(TimerMsg)
+	ON_MESSAGE(LeaveViewMsg)
+END_MESSAGE_MAP()
+
 CWheelButton::CWheelButton() : CBackground(),
-	_fieldE0(0), _fieldE4(0), _fieldE8(0) {
+	_fieldE0(0), _timerId(0), _fieldE8(0) {
 }
 
 void CWheelButton::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	file->writeNumberLine(_fieldE0, indent);
-	file->writeNumberLine(_fieldE4, indent);
+	file->writeNumberLine(_timerId, indent);
 	file->writeNumberLine(_fieldE8, indent);
 
 	CBackground::save(file, indent);
@@ -40,10 +46,43 @@ void CWheelButton::save(SimpleFile *file, int indent) {
 void CWheelButton::load(SimpleFile *file) {
 	file->readNumber();
 	_fieldE0 = file->readNumber();
-	_fieldE4 = file->readNumber();
+	_timerId = file->readNumber();
 	_fieldE8 = file->readNumber();
 
 	CBackground::load(file);
 }
 
+bool CWheelButton::SignalObject(CSignalObject *msg) {
+	bool oldFlag = _fieldE0;
+	_fieldE0 = msg->_numValue != 0;
+
+	if (oldFlag != _fieldE0) {
+		if (_fieldE0) {
+			_timerId = addTimer(500, 500);
+		} else {
+			stopAnimTimer(_timerId);
+			_timerId = 0;
+			setVisible(false);
+		}
+	}
+
+	return true;
+}
+
+bool CWheelButton::TimerMsg(CTimerMsg *msg) {
+	setVisible(!_visible);
+	makeDirty();
+	return true;
+}
+
+bool CWheelButton::LeaveViewMsg(CLeaveViewMsg *msg) {
+	if (_timerId) {
+		stopAnimTimer(_timerId);
+		_timerId = 0;
+		setVisible(false);
+	}
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/wheel_button.h b/engines/titanic/game/wheel_button.h
index cb089a6..097b686 100644
--- a/engines/titanic/game/wheel_button.h
+++ b/engines/titanic/game/wheel_button.h
@@ -28,9 +28,13 @@
 namespace Titanic {
 
 class CWheelButton : public CBackground {
+	DECLARE_MESSAGE_MAP;
+	bool SignalObject(CSignalObject *msg);
+	bool TimerMsg(CTimerMsg *msg);
+	bool LeaveViewMsg(CLeaveViewMsg *msg);
 public:
 	int _fieldE0;
-	int _fieldE4;
+	int _timerId;
 	int _fieldE8;
 public:
 	CLASSDEF;
diff --git a/engines/titanic/game/wheel_hotspot.cpp b/engines/titanic/game/wheel_hotspot.cpp
index f9af594..544e6f5 100644
--- a/engines/titanic/game/wheel_hotspot.cpp
+++ b/engines/titanic/game/wheel_hotspot.cpp
@@ -24,6 +24,11 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CWheelHotSpot, CBackground)
+	ON_MESSAGE(MouseButtonDownMsg)
+	ON_MESSAGE(SignalObject)
+END_MESSAGE_MAP()
+
 void CWheelHotSpot::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	file->writeNumberLine(_fieldE0, indent);
@@ -40,4 +45,39 @@ void CWheelHotSpot::load(SimpleFile *file) {
 	CBackground::load(file);
 }
 
+bool CWheelHotSpot::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	if (_fieldE0) {
+		CActMsg actMsg;
+
+		switch (_fieldE4) {
+		case 1:
+			actMsg._action = "Stop";
+			actMsg.execute("CaptainsWheel");
+			break;
+
+		case 2:
+			actMsg._action = "Cruise";
+			actMsg.execute("CaptainsWheel");
+			break;
+
+		case 3:
+			actMsg._action = "Go";
+			actMsg.execute("CaptainsWheel");
+			break;
+
+		default:
+			break;
+		}
+	} else if (_fieldE4 == 3) {
+		petDisplayMessage("Go where?");
+	}
+
+	return true;
+}
+
+bool CWheelHotSpot::SignalObject(CSignalObject *msg) {
+	_fieldE0 = msg->_numValue != 0;
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/wheel_hotspot.h b/engines/titanic/game/wheel_hotspot.h
index 364fe9a..e9071a2 100644
--- a/engines/titanic/game/wheel_hotspot.h
+++ b/engines/titanic/game/wheel_hotspot.h
@@ -28,6 +28,9 @@
 namespace Titanic {
 
 class CWheelHotSpot : public CBackground {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
+	bool SignalObject(CSignalObject *msg);
 public:
 	int _fieldE0;
 	int _fieldE4;
diff --git a/engines/titanic/game/wheel_spin.cpp b/engines/titanic/game/wheel_spin.cpp
index daa9918..79f8387 100644
--- a/engines/titanic/game/wheel_spin.cpp
+++ b/engines/titanic/game/wheel_spin.cpp
@@ -24,16 +24,36 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CWheelSpin, CBackground)
+	ON_MESSAGE(SignalObject)
+	ON_MESSAGE(MouseButtonDownMsg)
+END_MESSAGE_MAP()
+
 void CWheelSpin::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeNumberLine(_value, indent);
+	file->writeNumberLine(_active, indent);
 	CBackground::save(file, indent);
 }
 
 void CWheelSpin::load(SimpleFile *file) {
 	file->readNumber();
-	_value = file->readNumber();
+	_active = file->readNumber();
 	CBackground::load(file);
 }
 
+bool CWheelSpin::SignalObject(CSignalObject *msg) {
+	_active = msg->_numValue != 0;
+	setVisible(_active);
+	return true;
+}
+
+bool CWheelSpin::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	if (_active) {
+		CActMsg actMsg("Spin");
+		actMsg.execute("CaptainsWheel");
+	}
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/wheel_spin.h b/engines/titanic/game/wheel_spin.h
index 509db1a..f7993f0 100644
--- a/engines/titanic/game/wheel_spin.h
+++ b/engines/titanic/game/wheel_spin.h
@@ -28,11 +28,14 @@
 namespace Titanic {
 
 class CWheelSpin : public CBackground {
+	DECLARE_MESSAGE_MAP;
+	bool SignalObject(CSignalObject *msg);
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
 public:
-	int _value;
+	bool _active;
 public:
 	CLASSDEF;
-	CWheelSpin() : CBackground(), _value(0) {}
+	CWheelSpin() : CBackground(), _active(false) {}
 
 	/**
 	 * Save the data for the class to file
diff --git a/engines/titanic/gfx/chev_switch.cpp b/engines/titanic/gfx/chev_switch.cpp
index 177f0ad..eb6c318 100644
--- a/engines/titanic/gfx/chev_switch.cpp
+++ b/engines/titanic/gfx/chev_switch.cpp
@@ -52,8 +52,8 @@ bool CChevSwitch::SetChevButtonImageMsg(CSetChevButtonImageMsg *msg) {
 		error("TODO: Don't know parent type");
 	}
 
-	_fieldBC = msg->_value1;
-	if (_fieldBC) {
+	_pressed = msg->_value1;
+	if (_pressed) {
 		loadImage((_value & 1) ? "on_odd.tga" : "on_even.tga");
 	} else {
 		loadImage((_value & 1) ? "off_odd.tga" : "off_even.tga");
@@ -63,13 +63,13 @@ bool CChevSwitch::SetChevButtonImageMsg(CSetChevButtonImageMsg *msg) {
 }
 
 bool CChevSwitch::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
-	_fieldBC ^= 1;
+	_pressed ^= 1;
 	if (getParent()) {
-		CSetChevPanelBitMsg bitMsg(_value, _fieldBC);
+		CSetChevPanelBitMsg bitMsg(_value, _pressed);
 		bitMsg.execute(getParent());
 	}
 
-	CSetChevButtonImageMsg chevMsg(_fieldBC, 0);
+	CSetChevButtonImageMsg chevMsg(_pressed, 0);
 	chevMsg.execute(this);
 
 	return true;
diff --git a/engines/titanic/gfx/toggle_button.h b/engines/titanic/gfx/toggle_button.h
index 5328072..4fb7cdf 100644
--- a/engines/titanic/gfx/toggle_button.h
+++ b/engines/titanic/gfx/toggle_button.h
@@ -29,7 +29,7 @@ namespace Titanic {
 
 class CToggleButton : public CBackground {
 	DECLARE_MESSAGE_MAP;
-private:
+protected:
 	int _fieldE0;
 public:
 	CLASSDEF;
diff --git a/engines/titanic/gfx/toggle_switch.cpp b/engines/titanic/gfx/toggle_switch.cpp
index 20cbb86..456ac79 100644
--- a/engines/titanic/gfx/toggle_switch.cpp
+++ b/engines/titanic/gfx/toggle_switch.cpp
@@ -24,12 +24,18 @@
 
 namespace Titanic {
 
-CToggleSwitch::CToggleSwitch() : CGameObject(), _fieldBC(0) {
+BEGIN_MESSAGE_MAP(CToggleSwitch, CToggleSwitch)
+	ON_MESSAGE(MouseButtonUpMsg)
+	ON_MESSAGE(ChildDragStartMsg)
+	ON_MESSAGE(ChildDragMoveMsg)
+END_MESSAGE_MAP()
+
+CToggleSwitch::CToggleSwitch() : CGameObject(), _pressed(false) {
 }
 
 void CToggleSwitch::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeNumberLine(_fieldBC, indent);
+	file->writeNumberLine(_pressed, indent);
 	file->writePoint(_pos1, indent);
 
 	CGameObject::save(file, indent);
@@ -37,10 +43,30 @@ void CToggleSwitch::save(SimpleFile *file, int indent) {
 
 void CToggleSwitch::load(SimpleFile *file) {
 	file->readNumber();
-	_fieldBC = file->readNumber();
+	_pressed = file->readNumber();
 	_pos1 = file->readPoint();
 
 	CGameObject::load(file);
 }
 
+bool CToggleSwitch::MouseButtonUpMsg(CMouseButtonUpMsg *msg) {
+	_pressed = !_pressed;
+	if (_pressed)
+		fn10(0, 0, 0);
+	else
+		fn10(0xff, 0xff, 0xff);
+	return true;
+}
+
+bool CToggleSwitch::ChildDragStartMsg(CChildDragStartMsg *msg) {
+	_pos1.x = msg->_mousePos.x - _bounds.left;
+	_pos1.y = msg->_mousePos.y - _bounds.top;
+	return true;
+}
+
+bool CToggleSwitch::ChildDragMoveMsg(CChildDragMoveMsg *msg) {
+	setPosition(Point(msg->_mousePos.x - _pos1.x, msg->_mousePos.y - _pos1.y));
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/gfx/toggle_switch.h b/engines/titanic/gfx/toggle_switch.h
index 8e7d057..69b8c50 100644
--- a/engines/titanic/gfx/toggle_switch.h
+++ b/engines/titanic/gfx/toggle_switch.h
@@ -28,8 +28,12 @@
 namespace Titanic {
 
 class CToggleSwitch : public CGameObject {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonUpMsg(CMouseButtonUpMsg *msg);
+	bool ChildDragStartMsg(CChildDragStartMsg *msg);
+	bool ChildDragMoveMsg(CChildDragMoveMsg *msg);
 protected:
-	int _fieldBC;
+	bool _pressed;
 	Point _pos1;
 public:
 	CLASSDEF;
diff --git a/engines/titanic/messages/messages.h b/engines/titanic/messages/messages.h
index a65e63e..b70bc5e 100644
--- a/engines/titanic/messages/messages.h
+++ b/engines/titanic/messages/messages.h
@@ -252,7 +252,7 @@ MESSAGE2(CMovieFrameMsg, int, frameNumber, 0, int, value2, 0);
 MESSAGE0(CMusicHasStartedMsg);
 MESSAGE0(CMusicHasStoppedMsg);
 MESSAGE0(CMusicSettingChangedMsg);
-MESSAGE2(CNPCPlayAnimationMsg, const char *const *, names, nullptr, int, value2, 0);
+MESSAGE2(CNPCPlayAnimationMsg, const char *const *, names, nullptr, int, maxDuration, 0);
 MESSAGE1(CNPCPlayIdleAnimationMsg, const char *const *, names, 0);
 MESSAGE3(CNPCPlayTalkingAnimationMsg, int, value1, 0, int, value2, 0, const char *const *, names, nullptr);
 MESSAGE0(CNPCQueueIdleAnimMsg);
diff --git a/engines/titanic/moves/trip_down_canal.cpp b/engines/titanic/moves/trip_down_canal.cpp
index c8051dd..e9818fa 100644
--- a/engines/titanic/moves/trip_down_canal.cpp
+++ b/engines/titanic/moves/trip_down_canal.cpp
@@ -24,6 +24,10 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CTripDownCanal, CMovePlayerTo)
+	ON_MESSAGE(MouseButtonDownMsg)
+END_MESSAGE_MAP()
+
 CTripDownCanal::CTripDownCanal() : CMovePlayerTo() {
 }
 
@@ -37,4 +41,14 @@ void CTripDownCanal::load(SimpleFile *file) {
 	CMovePlayerTo::load(file);
 }
 
+bool CTripDownCanal::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	if (stateGetSeason() == SEASON_WINTER) {
+		petDisplayMessage("Sadly, the Grand Canal transport system is closed for the winter.");
+	} else if (getGameManager()) {
+		changeView(_destination);
+	}
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/moves/trip_down_canal.h b/engines/titanic/moves/trip_down_canal.h
index 736caf4..f43fb05 100644
--- a/engines/titanic/moves/trip_down_canal.h
+++ b/engines/titanic/moves/trip_down_canal.h
@@ -28,6 +28,8 @@
 namespace Titanic {
 
 class CTripDownCanal : public CMovePlayerTo {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
 public:
 	CLASSDEF;
 	CTripDownCanal();
diff --git a/engines/titanic/npcs/true_talk_npc.cpp b/engines/titanic/npcs/true_talk_npc.cpp
index 5ba68aa..97913df 100644
--- a/engines/titanic/npcs/true_talk_npc.cpp
+++ b/engines/titanic/npcs/true_talk_npc.cpp
@@ -188,7 +188,34 @@ bool CTrueTalkNPC::TimerMsg(CTimerMsg *msg) {
 }
 
 bool CTrueTalkNPC::NPCPlayAnimationMsg(CNPCPlayAnimationMsg *msg) {
-	warning("CTrueTalkNPC::NPCPlayAnimationMsg");
+//	const char *const *nameP = msg->_names;
+	int count;
+	for (count = 0; msg->_names[count]; ++count)
+		;
+
+	if (msg->_maxDuration) {
+		// Randomly pick a clip that's less than the allowed maximum
+		int tries = 10, index;
+		do {
+			index = getRandomNumber(count - 1);
+		} while (getClipDuration(msg->_names[index]) > msg->_maxDuration && --tries);
+
+		if (tries) {
+			// Sequentially go through the clips to find any below the maximum
+			index = 0;
+			for (int idx = 0; idx < count; ++idx) {
+				if (getClipDuration(msg->_names[idx]) < msg->_maxDuration) {
+					index = idx;
+					break;
+				}
+			}
+		}
+
+		playClip(msg->_names[index], MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT);
+	} else {
+		playClip(msg->_names[getRandomNumber(count - 1)]);
+	}
+
 	return true;
 }
 





More information about the Scummvm-git-logs mailing list