aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/game/gondolier
diff options
context:
space:
mode:
authorPaul Gilbert2016-08-21 21:41:48 -0400
committerPaul Gilbert2016-08-21 21:41:48 -0400
commite7d0047b5334bef6688a5f81c200630a58ff89c4 (patch)
tree62fb8f5e0a453d67674e304b4f8102d93d5cba02 /engines/titanic/game/gondolier
parent9ebd75742eb3a4fac4f6ff3ae421ec67be1f28eb (diff)
downloadscummvm-rg350-e7d0047b5334bef6688a5f81c200630a58ff89c4.tar.gz
scummvm-rg350-e7d0047b5334bef6688a5f81c200630a58ff89c4.tar.bz2
scummvm-rg350-e7d0047b5334bef6688a5f81c200630a58ff89c4.zip
TITANIC: Implemented more game classes
Diffstat (limited to 'engines/titanic/game/gondolier')
-rw-r--r--engines/titanic/game/gondolier/gondolier_base.cpp27
-rw-r--r--engines/titanic/game/gondolier/gondolier_base.h10
-rw-r--r--engines/titanic/game/gondolier/gondolier_chest.cpp29
-rw-r--r--engines/titanic/game/gondolier/gondolier_chest.h4
-rw-r--r--engines/titanic/game/gondolier/gondolier_face.cpp23
-rw-r--r--engines/titanic/game/gondolier/gondolier_face.h7
-rw-r--r--engines/titanic/game/gondolier/gondolier_mixer.cpp152
-rw-r--r--engines/titanic/game/gondolier/gondolier_mixer.h17
8 files changed, 234 insertions, 35 deletions
diff --git a/engines/titanic/game/gondolier/gondolier_base.cpp b/engines/titanic/game/gondolier/gondolier_base.cpp
index 1f7339cf38..f3dc31c9f5 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 a7ea2d4931..06d77ba85f 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 b3e7217502..cf6656732b 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 d796917371..8f069241a0 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 bdab8491ed..d7bcfa3561 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 71bdd6d444..b441204d3f 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 9b7b72c11b..26deda8bca 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 247e520ba6..167650f5bb 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();