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

dreammaster dreammaster at scummvm.org
Mon Aug 22 03:41:55 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:
e7d0047b53 TITANIC: Implemented more game classes


Commit: e7d0047b5334bef6688a5f81c200630a58ff89c4
    https://github.com/scummvm/scummvm/commit/e7d0047b5334bef6688a5f81c200630a58ff89c4
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2016-08-21T21:41:48-04:00

Commit Message:
TITANIC: Implemented more game classes

Changed paths:
    engines/titanic/carry/fruit.cpp
    engines/titanic/carry/fruit.h
    engines/titanic/carry/glass.cpp
    engines/titanic/carry/glass.h
    engines/titanic/game/floor_indicator.cpp
    engines/titanic/game/floor_indicator.h
    engines/titanic/game/games_console.cpp
    engines/titanic/game/games_console.h
    engines/titanic/game/get_lift_eye2.cpp
    engines/titanic/game/get_lift_eye2.h
    engines/titanic/game/glass_smasher.cpp
    engines/titanic/game/glass_smasher.h
    engines/titanic/game/gondolier/gondolier_base.cpp
    engines/titanic/game/gondolier/gondolier_base.h
    engines/titanic/game/gondolier/gondolier_chest.cpp
    engines/titanic/game/gondolier/gondolier_chest.h
    engines/titanic/game/gondolier/gondolier_face.cpp
    engines/titanic/game/gondolier/gondolier_face.h
    engines/titanic/game/gondolier/gondolier_mixer.cpp
    engines/titanic/game/gondolier/gondolier_mixer.h
    engines/titanic/game/television.cpp
    engines/titanic/game/transport/gondolier.cpp
    engines/titanic/game/transport/gondolier.h
    engines/titanic/messages/messages.h



diff --git a/engines/titanic/carry/fruit.cpp b/engines/titanic/carry/fruit.cpp
index 832dccf..68f3af7 100644
--- a/engines/titanic/carry/fruit.cpp
+++ b/engines/titanic/carry/fruit.cpp
@@ -21,9 +21,17 @@
  */
 
 #include "titanic/carry/fruit.h"
+#include "titanic/npcs/character.h"
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CFruit, CCarry)
+	ON_MESSAGE(UseWithCharMsg)
+	ON_MESSAGE(LemonFallsFromTreeMsg)
+	ON_MESSAGE(UseWithOtherMsg)
+	ON_MESSAGE(FrameMsg)
+END_MESSAGE_MAP()
+
 CFruit::CFruit() : CCarry(), _field12C(0),
 		_field130(0), _field134(0), _field138(0) {
 }
@@ -48,4 +56,43 @@ void CFruit::load(SimpleFile *file) {
 	CCarry::load(file);
 }
 
+bool CFruit::UseWithCharMsg(CUseWithCharMsg *msg) {
+	if (msg->_character->isEquals("Barbot") && msg->_character->_visible) {
+		CActMsg actMsg("Fruit");
+		actMsg.execute(msg->_character);
+		_fieldE0 = 0;
+		setVisible(false);
+		return true;
+	} else {
+		return CCarry::UseWithCharMsg(msg);
+	}
+}
+
+bool CFruit::LemonFallsFromTreeMsg(CLemonFallsFromTreeMsg *msg) {
+	setVisible(true);
+	dragMove(msg->_pt);
+	_field130 = 1;
+	return true;
+}
+
+bool CFruit::UseWithOtherMsg(CUseWithOtherMsg *msg) {
+	petAddToInventory();
+	return true;
+}
+
+bool CFruit::FrameMsg(CFrameMsg *msg) {
+	if (_field130) {
+		if (_bounds.top > 240) {
+			_field130 = 0;
+			_field134 = 1;
+		}
+
+		makeDirty();
+		_bounds.top += 3;
+		makeDirty();
+	}
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/carry/fruit.h b/engines/titanic/carry/fruit.h
index 93fe920..bcbd314 100644
--- a/engines/titanic/carry/fruit.h
+++ b/engines/titanic/carry/fruit.h
@@ -28,6 +28,11 @@
 namespace Titanic {
 
 class CFruit : public CCarry {
+	DECLARE_MESSAGE_MAP;
+	bool UseWithCharMsg(CUseWithCharMsg *msg);
+	bool LemonFallsFromTreeMsg(CLemonFallsFromTreeMsg *msg);
+	bool UseWithOtherMsg(CUseWithOtherMsg *msg);
+	bool FrameMsg(CFrameMsg *msg);
 private:
 	int _field12C;
 	int _field130;
diff --git a/engines/titanic/carry/glass.cpp b/engines/titanic/carry/glass.cpp
index 051457a..03050dc 100644
--- a/engines/titanic/carry/glass.cpp
+++ b/engines/titanic/carry/glass.cpp
@@ -21,9 +21,21 @@
  */
 
 #include "titanic/carry/glass.h"
+#include "titanic/carry/chicken.h"
+#include "titanic/game/sauce_dispensor.h"
+#include "titanic/npcs/character.h"
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CGlass, CCarry)
+	ON_MESSAGE(UseWithOtherMsg)
+	ON_MESSAGE(UseWithCharMsg)
+	ON_MESSAGE(ActMsg)
+	ON_MESSAGE(MouseDragEndMsg)
+	ON_MESSAGE(TurnOn)
+	ON_MESSAGE(TurnOff)
+END_MESSAGE_MAP()
+
 CGlass::CGlass() : CCarry(), _string6("None") {
 }
 
@@ -39,4 +51,108 @@ void CGlass::load(SimpleFile *file) {
 	CCarry::load(file);
 }
 
+bool CGlass::UseWithOtherMsg(CUseWithOtherMsg *msg) {
+	CSauceDispensor *dispensor = dynamic_cast<CSauceDispensor *>(msg->_other);
+	CChicken *chicken = dynamic_cast<CChicken *>(msg->_other);
+
+	if (dispensor && _string6 != "None") {
+		CUse useMsg(this);
+		useMsg.execute(dispensor);
+	} else if (msg->_other->isEquals("Chicken") && _string6 != "None") {
+		if (chicken->_string6 != "None") {
+			if (!chicken->_field12C) {
+				CActMsg actMsg(_string6);
+				actMsg.execute("Chicken");
+			}
+
+			_string6 = "None";
+			loadFrame(0);
+			_visibleFrame = 0;
+		}
+
+		petAddToInventory();
+	} else if (msg->_other->isEquals("Napkin") && _string6 != "None") {
+		petAddToInventory();
+		_string6 = "None";
+		loadFrame(0);
+		_visibleFrame = 0;
+	} else {
+		petAddToInventory();
+	}
+
+	return true;
+}
+
+bool CGlass::UseWithCharMsg(CUseWithCharMsg *msg) {
+	if (msg->_character->isEquals("Barbot") && msg->_character->_visible) {
+		CActMsg actMsg(_string6);
+		setVisible(false);
+
+		if (_string6 != "Bird")
+			setPosition(_origPos);
+		
+		actMsg.execute(msg->_character);
+	} else {
+		petAddToInventory();
+	}
+
+	return true;
+}
+
+bool CGlass::ActMsg(CActMsg *msg) {
+	if (msg->_action == "GoToPET") {
+		setVisible(true);
+		petAddToInventory();
+	} else if (msg->_action == "Mustard") {
+		_string6 = "Mustard";
+		loadFrame(1);
+		_visibleFrame = 1;
+	} else if (msg->_action == "Tomato") {
+		_string6 = "Tomato";
+		loadFrame(2);
+		_visibleFrame = 2;
+	} else if (msg->_action == "Bird") {
+		_string6 = "Bird";
+		loadFrame(3);
+		_visibleFrame = 3;
+	} else if (msg->_action == "InTitilator") {
+		_string6 = "None";
+		loadFrame(0);
+		_visibleFrame = 0;
+	}
+
+	return true;
+}
+
+bool CGlass::MouseDragEndMsg(CMouseDragEndMsg *msg) {
+	showMouse();
+	if (msg->_dropTarget) {
+		error("TODO: See what drop target is");
+		CCharacter *npc = dynamic_cast<CCharacter *>(msg->_dropTarget);
+		if (npc) {
+			CUseWithCharMsg useMsg(npc);
+			useMsg.execute(this);
+		} else {
+			CUseWithOtherMsg otherMsg(npc);
+			otherMsg.execute(this);
+		}
+	} else if (compareViewNameTo(_fullViewName) && msg->_mousePos.y < 360) {
+		setPosition(_origPos);
+	} else {
+		petAddToInventory();
+	}
+
+	return true;
+}
+
+bool CGlass::TurnOn(CTurnOn *msg) {
+	setVisible(true);
+	return true;
+}
+
+bool CGlass::TurnOff(CTurnOff *msg) {
+	setVisible(false);
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/carry/glass.h b/engines/titanic/carry/glass.h
index 9f4056b..8544384 100644
--- a/engines/titanic/carry/glass.h
+++ b/engines/titanic/carry/glass.h
@@ -28,6 +28,13 @@
 namespace Titanic {
 
 class CGlass : public CCarry {
+	DECLARE_MESSAGE_MAP;
+	bool UseWithOtherMsg(CUseWithOtherMsg *msg);
+	bool UseWithCharMsg(CUseWithCharMsg *msg);
+	bool ActMsg(CActMsg *msg);
+	bool MouseDragEndMsg(CMouseDragEndMsg *msg);
+	bool TurnOn(CTurnOn *msg);
+	bool TurnOff(CTurnOff *msg);
 private:
 	CString _string6;
 public:
diff --git a/engines/titanic/game/floor_indicator.cpp b/engines/titanic/game/floor_indicator.cpp
index 360232c..3afb03c 100644
--- a/engines/titanic/game/floor_indicator.cpp
+++ b/engines/titanic/game/floor_indicator.cpp
@@ -21,9 +21,14 @@
  */
 
 #include "titanic/game/floor_indicator.h"
+#include "titanic/pet_control/pet_control.h"
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CFloorIndicator, CGameObject)
+	ON_MESSAGE(EnterViewMsg)
+END_MESSAGE_MAP()
+
 void CFloorIndicator::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CGameObject::save(file, indent);
@@ -34,4 +39,10 @@ void CFloorIndicator::load(SimpleFile *file) {
 	CGameObject::load(file);
 }
 
+bool CFloorIndicator::EnterViewMsg(CEnterViewMsg *msg) {
+	int floorNum = MAX(1, getPetControl()->getRoomsFloorNum());
+	loadFrame(floorNum - 1);
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/floor_indicator.h b/engines/titanic/game/floor_indicator.h
index 066209e..38a1757 100644
--- a/engines/titanic/game/floor_indicator.h
+++ b/engines/titanic/game/floor_indicator.h
@@ -28,6 +28,8 @@
 namespace Titanic {
 
 class CFloorIndicator : public CGameObject {
+	DECLARE_MESSAGE_MAP;
+	bool EnterViewMsg(CEnterViewMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/games_console.cpp b/engines/titanic/game/games_console.cpp
index b7500f9..40311f7 100644
--- a/engines/titanic/game/games_console.cpp
+++ b/engines/titanic/game/games_console.cpp
@@ -24,16 +24,42 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CGamesConsole, CBackground)
+	ON_MESSAGE(MouseButtonDownMsg)
+	ON_MESSAGE(LeaveViewMsg)
+END_MESSAGE_MAP()
+
 void CGamesConsole::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeNumberLine(_fieldE0, indent);
+	file->writeNumberLine(_active, indent);
 	CBackground::save(file, indent);
 }
 
 void CGamesConsole::load(SimpleFile *file) {
 	file->readNumber();
-	_fieldE0 = file->readNumber();
+	_active = file->readNumber();
 	CBackground::load(file);
 }
 
+bool CGamesConsole::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	if (_active) {
+		playMovie(23, 44, 0);
+		_active = false;
+	} else {
+		playMovie(0, 23, 0);
+		_active = true;
+	}
+
+	return true;
+}
+
+bool CGamesConsole::LeaveViewMsg(CLeaveViewMsg *msg) {
+	if (_active) {
+		_active = false;
+		playMovie(23, 44, MOVIE_GAMESTATE);
+	}
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/games_console.h b/engines/titanic/game/games_console.h
index 2b1da70..f849fd0 100644
--- a/engines/titanic/game/games_console.h
+++ b/engines/titanic/game/games_console.h
@@ -28,11 +28,14 @@
 namespace Titanic {
 
 class CGamesConsole : public CBackground {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
+	bool LeaveViewMsg(CLeaveViewMsg *msg);
 public:
-	int _fieldE0;
+	bool _active;
 public:
 	CLASSDEF;
-	CGamesConsole() : CBackground(), _fieldE0(0) {}
+	CGamesConsole() : CBackground(), _active(false) {}
 
 	/**
 	 * Save the data for the class to file
diff --git a/engines/titanic/game/get_lift_eye2.cpp b/engines/titanic/game/get_lift_eye2.cpp
index 7747f7b..914f306 100644
--- a/engines/titanic/game/get_lift_eye2.cpp
+++ b/engines/titanic/game/get_lift_eye2.cpp
@@ -21,34 +21,80 @@
  */
 
 #include "titanic/game/get_lift_eye2.h"
+#include "titanic/game/transport/lift.h"
+#include "titanic/core/project_item.h"
+#include "titanic/pet_control/pet_control.h"
 
 namespace Titanic {
 
-CString *CGetLiftEye2::_v1;
+BEGIN_MESSAGE_MAP(CGetLiftEye2, CGameObject)
+	ON_MESSAGE(ActMsg)
+	ON_MESSAGE(EnterRoomMsg)
+	ON_MESSAGE(VisibleMsg)
+	ON_MESSAGE(MouseDragStartMsg)
+END_MESSAGE_MAP()
+
+CString *CGetLiftEye2::_destObject;
 
 void CGetLiftEye2::init() {
-	_v1 = new CString();
+	_destObject = new CString();
 }
 
 void CGetLiftEye2::deinit() {
-	delete _v1;
+	delete _destObject;
 }
 
 void CGetLiftEye2::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeQuotedLine(*_v1, indent);
+	file->writeQuotedLine(*_destObject, indent);
 	CGameObject::save(file, indent);
 }
 
 void CGetLiftEye2::load(SimpleFile *file) {
 	file->readNumber();
-	*_v1 = file->readString();
+	*_destObject = file->readString();
 	CGameObject::load(file);
 }
 
+bool CGetLiftEye2::ActMsg(CActMsg *msg) {
+	*_destObject = msg->_action;
+	setVisible(true);
+	return true;
+}
+
 bool CGetLiftEye2::EnterRoomMsg(CEnterRoomMsg *msg) {
-	warning("CGetLiftEye2::handleEvent");
+	CPetControl *pet = getPetControl();
+	if (pet->getRoomsElevatorNum() == 4 && CLift::_v1 == 1 && !CLift::_v6) {
+		_cursorId = CURSOR_HAND;
+		setVisible(true);
+	} else {
+		_cursorId = CURSOR_ARROW;
+		setVisible(false);
+	}
+
 	return true;
 }
 
+bool CGetLiftEye2::VisibleMsg(CVisibleMsg *msg) {
+	setVisible(true);
+	_cursorId = CURSOR_HAND;
+	return true;
+}
+
+bool CGetLiftEye2::MouseDragStartMsg(CMouseDragStartMsg *msg) {
+	if (checkPoint(msg->_mousePos, false, true)) {
+		_cursorId = CURSOR_ARROW;
+		setVisible(false);
+		CActMsg actMsg("EyeNotHead");
+		actMsg.execute(*_destObject);
+		CPassOnDragStartMsg dragMsg(msg->_mousePos, 1);
+		dragMsg.execute(*_destObject);
+
+		msg->_dragItem = getRoot()->findByName(*_destObject);
+		return true;
+	} else {
+		return false;
+	}
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/get_lift_eye2.h b/engines/titanic/game/get_lift_eye2.h
index 496784a..c0dd492 100644
--- a/engines/titanic/game/get_lift_eye2.h
+++ b/engines/titanic/game/get_lift_eye2.h
@@ -28,9 +28,13 @@
 namespace Titanic {
 
 class CGetLiftEye2 : public CGameObject {
+	DECLARE_MESSAGE_MAP;
+	bool ActMsg(CActMsg *msg);
 	bool EnterRoomMsg(CEnterRoomMsg *msg);
+	bool VisibleMsg(CVisibleMsg *msg);
+	bool MouseDragStartMsg(CMouseDragStartMsg *msg);
 public:
-	static CString *_v1;
+	static CString *_destObject;
 public:
 	CLASSDEF;
 	static void init();
diff --git a/engines/titanic/game/glass_smasher.cpp b/engines/titanic/game/glass_smasher.cpp
index 8c33124..2123f2d 100644
--- a/engines/titanic/game/glass_smasher.cpp
+++ b/engines/titanic/game/glass_smasher.cpp
@@ -24,6 +24,11 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CGlassSmasher, CGameObject)
+	ON_MESSAGE(StatusChangeMsg)
+	ON_MESSAGE(MovieEndMsg)
+END_MESSAGE_MAP()
+
 void CGlassSmasher::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CGameObject::save(file, indent);
@@ -34,4 +39,18 @@ void CGlassSmasher::load(SimpleFile *file) {
 	CGameObject::load(file);
 }
 
+bool CGlassSmasher::StatusChangeMsg(CStatusChangeMsg *msg) {
+	setVisible(true);
+	playSound("b#40.wav");
+	playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+	return true;
+}
+
+bool CGlassSmasher::MovieEndMsg(CMovieEndMsg *msg) {
+	setVisible(false);
+	CVisibleMsg visibleMsg(true);
+	visibleMsg.execute("LongStickDispenser");
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/glass_smasher.h b/engines/titanic/game/glass_smasher.h
index 7e38f4e..e1eef6f 100644
--- a/engines/titanic/game/glass_smasher.h
+++ b/engines/titanic/game/glass_smasher.h
@@ -28,6 +28,9 @@
 namespace Titanic {
 
 class CGlassSmasher : public CGameObject {
+	DECLARE_MESSAGE_MAP;
+	bool StatusChangeMsg(CStatusChangeMsg *msg);
+	bool MovieEndMsg(CMovieEndMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/gondolier/gondolier_base.cpp b/engines/titanic/game/gondolier/gondolier_base.cpp
index 1f7339c..f3dc31c 100644
--- a/engines/titanic/game/gondolier/gondolier_base.cpp
+++ b/engines/titanic/game/gondolier/gondolier_base.cpp
@@ -24,12 +24,16 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CGondolierBase, CGameObject)
+	ON_MESSAGE(PuzzleSolvedMsg)
+END_MESSAGE_MAP()
+
 int CGondolierBase::_v1;
-int CGondolierBase::_v2;
-int CGondolierBase::_v3;
+bool CGondolierBase::_puzzleSolved;
+int CGondolierBase::_volume1;
 int CGondolierBase::_v4;
 int CGondolierBase::_v5;
-int CGondolierBase::_v6;
+int CGondolierBase::_volume2;
 int CGondolierBase::_v7;
 int CGondolierBase::_v8;
 int CGondolierBase::_v9;
@@ -38,11 +42,11 @@ int CGondolierBase::_v10;
 void CGondolierBase::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	file->writeNumberLine(_v1, indent);
-	file->writeNumberLine(_v2, indent);
-	file->writeNumberLine(_v3, indent);
+	file->writeNumberLine(_puzzleSolved, indent);
+	file->writeNumberLine(_volume1, indent);
 	file->writeNumberLine(_v4, indent);
 	file->writeNumberLine(_v5, indent);
-	file->writeNumberLine(_v6, indent);
+	file->writeNumberLine(_volume2, indent);
 	file->writeNumberLine(_v7, indent);
 	file->writeNumberLine(_v8, indent);
 	file->writeNumberLine(_v9, indent);
@@ -54,11 +58,11 @@ void CGondolierBase::save(SimpleFile *file, int indent) {
 void CGondolierBase::load(SimpleFile *file) {
 	file->readNumber();
 	_v1 = file->readNumber();
-	_v2 = file->readNumber();
-	_v3 = file->readNumber();
+	_puzzleSolved = file->readNumber();
+	_volume1 = file->readNumber();
 	_v4 = file->readNumber();
 	_v5 = file->readNumber();
-	_v6 = file->readNumber();
+	_volume2 = file->readNumber();
 	_v7 = file->readNumber();
 	_v8 = file->readNumber();
 	_v9 = file->readNumber();
@@ -67,4 +71,9 @@ void CGondolierBase::load(SimpleFile *file) {
 	CGameObject::load(file);
 }
 
+bool CGondolierBase::PuzzleSolvedMsg(CPuzzleSolvedMsg *msg) {
+	_puzzleSolved = true;
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/gondolier/gondolier_base.h b/engines/titanic/game/gondolier/gondolier_base.h
index a7ea2d4..06d77ba 100644
--- a/engines/titanic/game/gondolier/gondolier_base.h
+++ b/engines/titanic/game/gondolier/gondolier_base.h
@@ -28,13 +28,15 @@
 namespace Titanic {
 
 class CGondolierBase : public CGameObject {
-private:
+	DECLARE_MESSAGE_MAP;
+	bool PuzzleSolvedMsg(CPuzzleSolvedMsg *msg);
+protected:
 	static int _v1;
-	static int _v2;
-	static int _v3;
+	static bool _puzzleSolved;
+	static int _volume1;
 	static int _v4;
 	static int _v5;
-	static int _v6;
+	static int _volume2;
 	static int _v7;
 	static int _v8;
 	static int _v9;
diff --git a/engines/titanic/game/gondolier/gondolier_chest.cpp b/engines/titanic/game/gondolier/gondolier_chest.cpp
index b3e7217..cf66567 100644
--- a/engines/titanic/game/gondolier/gondolier_chest.cpp
+++ b/engines/titanic/game/gondolier/gondolier_chest.cpp
@@ -24,6 +24,12 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CGondolierChest, CGondolierBase)
+	ON_MESSAGE(MouseButtonDownMsg)
+	ON_MESSAGE(MovieEndMsg)
+	ON_MESSAGE(MouseDragStartMsg)
+END_MESSAGE_MAP()
+
 void CGondolierChest::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
 	CGondolierBase::save(file, indent);
@@ -34,4 +40,27 @@ void CGondolierChest::load(SimpleFile *file) {
 	CGondolierBase::load(file);
 }
 
+bool CGondolierChest::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
+	if (!_v1)
+		playMovie(0, 14, MOVIE_NOTIFY_OBJECT);
+	else if (msg->_mousePos.y < 330)
+		return false;
+	else if (!_v8 && !_v5) {
+		playMovie(14, 29, 0);
+		_v1 = 0;
+	}
+
+	return true;
+}
+
+bool CGondolierChest::MovieEndMsg(CMovieEndMsg *msg) {
+	if (msg->_endFrame == 14)
+		_v1 = 1;
+	return true;
+}
+
+bool CGondolierChest::MouseDragStartMsg(CMouseDragStartMsg *msg) {
+	return false;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/gondolier/gondolier_chest.h b/engines/titanic/game/gondolier/gondolier_chest.h
index d796917..8f06924 100644
--- a/engines/titanic/game/gondolier/gondolier_chest.h
+++ b/engines/titanic/game/gondolier/gondolier_chest.h
@@ -28,6 +28,10 @@
 namespace Titanic {
 
 class CGondolierChest : public CGondolierBase {
+	DECLARE_MESSAGE_MAP;
+	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg);
+	bool MovieEndMsg(CMovieEndMsg *msg);
+	bool MouseDragStartMsg(CMouseDragStartMsg *msg);
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/game/gondolier/gondolier_face.cpp b/engines/titanic/game/gondolier/gondolier_face.cpp
index bdab849..d7bcfa3 100644
--- a/engines/titanic/game/gondolier/gondolier_face.cpp
+++ b/engines/titanic/game/gondolier/gondolier_face.cpp
@@ -24,16 +24,35 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CGondolierFace, CGondolierBase)
+	ON_MESSAGE(EnterViewMsg)
+	ON_MESSAGE(StatusChangeMsg)
+END_MESSAGE_MAP()
+
 void CGondolierFace::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeNumberLine(_fieldBC, indent);
+	file->writeNumberLine(_flag, indent);
 	CGondolierBase::save(file, indent);
 }
 
 void CGondolierFace::load(SimpleFile *file) {
 	file->readNumber();
-	_fieldBC = file->readNumber();
+	_flag = file->readNumber();
 	CGondolierBase::load(file);
 }
 
+bool CGondolierFace::EnterViewMsg(CEnterViewMsg *msg) {
+	if (_flag)
+		playMovie(MOVIE_REPEAT);
+	else
+		setVisible(false);
+	return true;
+}
+
+bool CGondolierFace::StatusChangeMsg(CStatusChangeMsg *msg) {
+	_flag = msg->_newStatus != 1;
+	setVisible(_flag);
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/gondolier/gondolier_face.h b/engines/titanic/game/gondolier/gondolier_face.h
index 71bdd6d..b441204 100644
--- a/engines/titanic/game/gondolier/gondolier_face.h
+++ b/engines/titanic/game/gondolier/gondolier_face.h
@@ -28,11 +28,14 @@
 namespace Titanic {
 
 class CGondolierFace : public CGondolierBase {
+	DECLARE_MESSAGE_MAP;
+	bool EnterViewMsg(CEnterViewMsg *msg);
+	bool StatusChangeMsg(CStatusChangeMsg *msg);
 private:
-	int _fieldBC;
+	bool _flag;
 public:
 	CLASSDEF;
-	CGondolierFace() : CGondolierBase(), _fieldBC(0) {}
+	CGondolierFace() : CGondolierBase(), _flag(true) {}
 
 	/**
 	 * Save the data for the class to file
diff --git a/engines/titanic/game/gondolier/gondolier_mixer.cpp b/engines/titanic/game/gondolier/gondolier_mixer.cpp
index 9b7b72c..26deda8 100644
--- a/engines/titanic/game/gondolier/gondolier_mixer.cpp
+++ b/engines/titanic/game/gondolier/gondolier_mixer.cpp
@@ -25,20 +25,30 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CGondolierMixer, CGondolierBase)
+	ON_MESSAGE(EnterRoomMsg)
+	ON_MESSAGE(LeaveRoomMsg)
+	ON_MESSAGE(TurnOn)
+	ON_MESSAGE(TurnOff)
+	ON_MESSAGE(SetVolumeMsg)
+	ON_MESSAGE(SignalObject)
+	ON_MESSAGE(LoadSuccessMsg)
+END_MESSAGE_MAP()
+
 CGondolierMixer::CGondolierMixer() : CGondolierBase(),
-	_string1("c#0.wav"), _string2("c#1.wav"),
-	_fieldBC(-1), _fieldC0(-1), _fieldC4(0), _fieldC8(0),
-	_fieldE4(0) {
+	_soundName1("c#0.wav"), _soundName2("c#1.wav"),
+	_soundHandle1(-1), _soundHandle2(-1), _fieldC4(0), _fieldC8(0),
+	_fieldE4(false) {
 }
 
 void CGondolierMixer::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeNumberLine(_fieldBC, indent);
-	file->writeNumberLine(_fieldC0, indent);
+	file->writeNumberLine(_soundHandle1, indent);
+	file->writeNumberLine(_soundHandle2, indent);
 	file->writeNumberLine(_fieldC4, indent);
 	file->writeNumberLine(_fieldC8, indent);
-	file->writeQuotedLine(_string1, indent);
-	file->writeQuotedLine(_string2, indent);
+	file->writeQuotedLine(_soundName1, indent);
+	file->writeQuotedLine(_soundName2, indent);
 	file->writeNumberLine(_fieldE4, indent);
 
 	CGondolierBase::save(file, indent);
@@ -46,12 +56,12 @@ void CGondolierMixer::save(SimpleFile *file, int indent) {
 
 void CGondolierMixer::load(SimpleFile *file) {
 	file->readNumber();
-	_fieldBC = file->readNumber();
-	_fieldC0 = file->readNumber();
+	_soundHandle1 = file->readNumber();
+	_soundHandle2 = file->readNumber();
 	_fieldC4 = file->readNumber();
 	_fieldC8 = file->readNumber();
-	_string1 = file->readString();
-	_string2 = file->readString();
+	_soundName1 = file->readString();
+	_soundName2 = file->readString();
 	_fieldE4 = file->readNumber();
 
 	CGondolierBase::load(file);
@@ -59,10 +69,126 @@ void CGondolierMixer::load(SimpleFile *file) {
 
 bool CGondolierMixer::EnterRoomMsg(CEnterRoomMsg *msg) {
 	CRoomItem *parentRoom = dynamic_cast<CRoomItem *>(getParent());
-	if (parentRoom == msg->_newRoom)
-		msg->execute(parentRoom);
+	if (parentRoom == msg->_newRoom) {
+		CTurnOn onMsg;
+		onMsg.execute(this);
+	}
 	
 	return true;
 }
 
+bool CGondolierMixer::LeaveRoomMsg(CLeaveRoomMsg *msg) {
+	CRoomItem *parentRoom = dynamic_cast<CRoomItem *>(getParent());
+	if (parentRoom == msg->_oldRoom) {
+		CTurnOff offMsg;
+		offMsg.execute(this);
+	}
+
+	return true;
+}
+
+bool CGondolierMixer::TurnOn(CTurnOn *msg) {
+	if (!_puzzleSolved) {
+		if (_soundHandle1 == -1) {
+			_soundHandle1 = playSound(_soundName1, _volume1 * _v4 / 10, 0, true);
+			_fieldE4 = true;
+		}
+
+		if (_soundHandle2 == -1) {
+			_soundHandle2 = playSound(_soundName1, _volume2 * _v7 / 10, 0, true);
+			_fieldE4 = true;
+		}
+	}
+
+	return true;
+}
+
+bool CGondolierMixer::TurnOff(CTurnOff *msg) {
+	if (_soundHandle1 != -1) {
+		if (isSoundActive(_soundHandle1))
+			stopSound(_soundHandle1, 2);
+
+		_soundHandle1 = -1;
+		_fieldE4 = false;
+	}
+
+	if (_soundHandle2 != -1) {
+		if (isSoundActive(_soundHandle2))
+			stopSound(_soundHandle2, 2);
+
+		_soundHandle2 = -1;
+		_fieldE4 = false;
+	}
+
+	return true;
+}
+
+bool CGondolierMixer::SetVolumeMsg(CSetVolumeMsg *msg) {
+	if (!_puzzleSolved) {
+		_volume1 = _volume2 = msg->_volume;
+
+		if (_soundHandle1 != -1 && isSoundActive(_soundHandle1))
+			setSoundVolume(_soundHandle1, msg->_volume * _v4 / 10, 2);
+		if (_soundHandle2 != -1 && isSoundActive(_soundHandle2))
+			setSoundVolume(_soundHandle2, msg->_volume * _v7 / 10, 2);
+	}
+
+	return true;
+}
+
+bool CGondolierMixer::SignalObject(CSignalObject *msg) {
+	if (!_puzzleSolved) {
+		if (msg->_strValue == "Fly") {
+			_v4 = CLIP(msg->_numValue, 0, 10);
+
+			if (!_v8) {
+				_v7 = 10 - _v4;
+				CStatusChangeMsg statusMsg;
+				statusMsg._newStatus = _v7;
+				statusMsg.execute("GondolierRightLever");
+			}
+		}
+
+		if (msg->_strValue == "Tos") {
+			_v7 = CLIP(msg->_numValue, 0, 10);
+
+			if (!_v5) {
+				_v4 = 10 - _v7;
+				CStatusChangeMsg statusMsg;
+				statusMsg._newStatus = _v4;
+				statusMsg.execute("GondolierLeftLever");
+			}
+		}
+
+		if (!_v4 && !_v7 && _v5 && _v8) {
+			_puzzleSolved = true;
+			CStatusChangeMsg statusMsg;
+			statusMsg._newStatus = 1;
+			statusMsg.execute("GondolierFace");
+			CTurnOff offMsg;
+			offMsg.execute(this);
+			CVisibleMsg visibleMsg;
+			visibleMsg.execute("Mouth");
+
+			playSound("z#47.wav");
+		} else {
+			CSetVolumeMsg volumeMsg(_volume1, 2);
+			volumeMsg.execute(this);
+		}
+	}
+
+	return true;
+}
+
+bool CGondolierMixer::LoadSuccessMsg(CLoadSuccessMsg *msg) {
+	if (_fieldE4) {
+		_fieldE4 = 0;
+		_soundHandle1 = _soundHandle2 = -1;
+		CTurnOn onMsg;
+		onMsg.execute(this);
+	}
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/gondolier/gondolier_mixer.h b/engines/titanic/game/gondolier/gondolier_mixer.h
index 247e520..167650f 100644
--- a/engines/titanic/game/gondolier/gondolier_mixer.h
+++ b/engines/titanic/game/gondolier/gondolier_mixer.h
@@ -29,15 +29,22 @@
 namespace Titanic {
 
 class CGondolierMixer : public CGondolierBase {
+	DECLARE_MESSAGE_MAP;
 	bool EnterRoomMsg(CEnterRoomMsg *msg);
+	bool LeaveRoomMsg(CLeaveRoomMsg *msg);
+	bool TurnOn(CTurnOn *msg);
+	bool TurnOff(CTurnOff *msg);
+	bool SetVolumeMsg(CSetVolumeMsg *msg);
+	bool SignalObject(CSignalObject *msg);
+	bool LoadSuccessMsg(CLoadSuccessMsg *msg);
 private:
-	int _fieldBC;
-	int _fieldC0;
+	int _soundHandle1;
+	int _soundHandle2;
 	int _fieldC4;
 	int _fieldC8;
-	CString _string1;
-	CString _string2;
-	int _fieldE4;
+	CString _soundName1;
+	CString _soundName2;
+	bool _fieldE4;
 public:
 	CLASSDEF;
 	CGondolierMixer();
diff --git a/engines/titanic/game/television.cpp b/engines/titanic/game/television.cpp
index af6bdb8..b3c10d4 100644
--- a/engines/titanic/game/television.cpp
+++ b/engines/titanic/game/television.cpp
@@ -251,7 +251,7 @@ bool CTelevision::MovieEndMsg(CMovieEndMsg *msg) {
 			loadFrame(502);
 		else
 			warning("There is currently nothing available for your viewing pleasure on this channel.");
-	} else if (_fieldE0 == 5 && *CGetLiftEye2::_v1 != "NULL") {
+	} else if (_fieldE0 == 5 && *CGetLiftEye2::_destObject != "NULL") {
 		loadFrame(393 + _v4);
 	} else {
 		warning("There is currently nothing available for your viewing pleasure on this channel.");
diff --git a/engines/titanic/game/transport/gondolier.cpp b/engines/titanic/game/transport/gondolier.cpp
index f731e45..8c28ff9 100644
--- a/engines/titanic/game/transport/gondolier.cpp
+++ b/engines/titanic/game/transport/gondolier.cpp
@@ -24,14 +24,31 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CGondolier, CTransport)
+	ON_MESSAGE(StatusChangeMsg)
+END_MESSAGE_MAP()
+
+int CGondolier::_v1;
+int CGondolier::_v2;
+
 void CGondolier::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
+	file->writeNumberLine(_v1, indent);
+	file->writeNumberLine(_v2, indent);
 	CTransport::save(file, indent);
 }
 
 void CGondolier::load(SimpleFile *file) {
 	file->readNumber();
+	_v1 = file->readNumber();
+	_v2 = file->readNumber();
 	CTransport::load(file);
 }
 
+bool CGondolier::StatusChangeMsg(CStatusChangeMsg *msg) {
+	CShowTextMsg textMsg("Only First Class passengers are allowed to use the Gondoliers.");
+	textMsg.execute("PET");
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/game/transport/gondolier.h b/engines/titanic/game/transport/gondolier.h
index ac16172..3b1e6d5 100644
--- a/engines/titanic/game/transport/gondolier.h
+++ b/engines/titanic/game/transport/gondolier.h
@@ -28,6 +28,11 @@
 namespace Titanic {
 
 class CGondolier : public CTransport {
+	DECLARE_MESSAGE_MAP;
+	bool StatusChangeMsg(CStatusChangeMsg *msg);
+private:
+	static int _v1;
+	static int _v2;
 public:
 	CLASSDEF;
 
diff --git a/engines/titanic/messages/messages.h b/engines/titanic/messages/messages.h
index 4c1fb4f..6a39619 100644
--- a/engines/titanic/messages/messages.h
+++ b/engines/titanic/messages/messages.h
@@ -236,7 +236,7 @@ MESSAGE2(CEnterRoomMsg, CRoomItem *, oldRoom, nullptr, CRoomItem *, newRoom, nul
 MESSAGE2(CEnterViewMsg, CViewItem *, oldView, nullptr, CViewItem *, newView, nullptr);
 MESSAGE0(CErasePhonographCylinderMsg);
 MESSAGE1(CFrameMsg, uint, ticks, 0);
-MESSAGE2(CFreshenCookieMsg, int, value1, 0, int, value2, 0);
+MESSAGE2(CFreshenCookieMsg, int, value1, 0, int, value2, 1);
 MESSAGE1(CGetChevClassBits, int, classBits, 0);
 MESSAGE1(CGetChevClassNum, int, classNum, 0);
 MESSAGE2(CGetChevCodeFromRoomNameMsg, CString, roomName, "", uint, chevCode, 0);
@@ -255,7 +255,7 @@ MESSAGE1(CKeyCharMsg, int, key, 32);
 MESSAGE2(CLeaveNodeMsg, CNodeItem *, oldNode, nullptr, CNodeItem *, newNode, nullptr);
 MESSAGE2(CLeaveRoomMsg, CRoomItem *, oldRoom, nullptr, CRoomItem *, newRoom, nullptr);
 MESSAGE2(CLeaveViewMsg, CViewItem *, oldView, nullptr, CViewItem *, newView, nullptr);
-MESSAGE2(CLemonFallsFromTreeMsg, int, value1, 0, int, value2, 0);
+MESSAGE1(CLemonFallsFromTreeMsg, Point, pt, Point());
 MESSAGE1(CLoadSuccessMsg, int, ticks, 0);
 MESSAGE1(CLockPhonographMsg, int, value, 0);
 MESSAGE0(CMaitreDDefeatedMsg);






More information about the Scummvm-git-logs mailing list