aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic
diff options
context:
space:
mode:
authorPaul Gilbert2016-08-28 14:39:59 -0400
committerPaul Gilbert2016-08-28 14:39:59 -0400
commit4933b59e8e039ae346f650c044e5fe0ba6310ead (patch)
tree805e33ea6fa6109e42d8f8b267ed2b6e5c2a00e2 /engines/titanic
parent1760fb3e0d25704685e9b44f0792536da962082d (diff)
downloadscummvm-rg350-4933b59e8e039ae346f650c044e5fe0ba6310ead.tar.gz
scummvm-rg350-4933b59e8e039ae346f650c044e5fe0ba6310ead.tar.bz2
scummvm-rg350-4933b59e8e039ae346f650c044e5fe0ba6310ead.zip
TITANIC: Implemented remaining game classes
Diffstat (limited to 'engines/titanic')
-rw-r--r--engines/titanic/carry/vision_centre.cpp29
-rw-r--r--engines/titanic/carry/vision_centre.h4
-rw-r--r--engines/titanic/core/turn_on_play_sound.cpp25
-rw-r--r--engines/titanic/core/turn_on_play_sound.h8
-rw-r--r--engines/titanic/core/turn_on_turn_off.cpp49
-rw-r--r--engines/titanic/core/turn_on_turn_off.h13
-rw-r--r--engines/titanic/game/placeholder/tv_on_bar.cpp18
-rw-r--r--engines/titanic/game/placeholder/tv_on_bar.h4
-rw-r--r--engines/titanic/game/sgt/sgt_nav.cpp44
-rw-r--r--engines/titanic/game/sgt/sgt_nav.h3
-rw-r--r--engines/titanic/game/sgt/toilet.cpp44
-rw-r--r--engines/titanic/game/sgt/toilet.h4
-rw-r--r--engines/titanic/game/sgt/vase.cpp40
-rw-r--r--engines/titanic/game/sgt/vase.h4
-rw-r--r--engines/titanic/game/sgt/washstand.cpp38
-rw-r--r--engines/titanic/game/sgt/washstand.h4
-rw-r--r--engines/titanic/game/third_class_canal.cpp9
-rw-r--r--engines/titanic/game/third_class_canal.h2
-rw-r--r--engines/titanic/game/throw_tv_down_well.cpp63
-rw-r--r--engines/titanic/game/throw_tv_down_well.h12
-rw-r--r--engines/titanic/game/titania_still_control.cpp16
-rw-r--r--engines/titanic/game/titania_still_control.h3
-rw-r--r--engines/titanic/game/tow_parrot_nav.cpp17
-rw-r--r--engines/titanic/game/tow_parrot_nav.h2
-rw-r--r--engines/titanic/game/up_lighter.cpp67
-rw-r--r--engines/titanic/game/up_lighter.h7
-rw-r--r--engines/titanic/game/useless_lever.cpp24
-rw-r--r--engines/titanic/game/useless_lever.h3
-rw-r--r--engines/titanic/game/wheel_button.cpp45
-rw-r--r--engines/titanic/game/wheel_button.h6
-rw-r--r--engines/titanic/game/wheel_hotspot.cpp40
-rw-r--r--engines/titanic/game/wheel_hotspot.h3
-rw-r--r--engines/titanic/game/wheel_spin.cpp24
-rw-r--r--engines/titanic/game/wheel_spin.h7
-rw-r--r--engines/titanic/gfx/chev_switch.cpp10
-rw-r--r--engines/titanic/gfx/toggle_button.h2
-rw-r--r--engines/titanic/gfx/toggle_switch.cpp32
-rw-r--r--engines/titanic/gfx/toggle_switch.h6
-rw-r--r--engines/titanic/messages/messages.h2
-rw-r--r--engines/titanic/moves/trip_down_canal.cpp14
-rw-r--r--engines/titanic/moves/trip_down_canal.h2
-rw-r--r--engines/titanic/npcs/true_talk_npc.cpp29
42 files changed, 722 insertions, 56 deletions
diff --git a/engines/titanic/carry/vision_centre.cpp b/engines/titanic/carry/vision_centre.cpp
index 8c8bab15f8..fd30089fc5 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 6cf8e2c653..14055a5f5f 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 2f9dba24a6..ab50b33134 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 1164135071..29a25a5665 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 d43ddf7038..6498c226a0 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 adca6876ff..c09f0e0d7d 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 e17fb7833d..710b5a346e 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 bb5381fb5d..0157bc8764 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 f98e486fd0..c004f947d2 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 40fdc4eff1..78f6417229 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 799abd6c76..b8e87b645a 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 d87531ad7a..a4bc318fb2 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 3e04b5db9e..2d37818340 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 8aa35acdf5..e07d9efb80 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 8127a59a59..afdc74414d 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 f140b17f49..1b72cfa1c4 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 6b0a101f7b..97b559e35d 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 f6fc471444..d0be8c05aa 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 c8a9fc7c9e..9de028cbde 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 b6003aa3ef..c9e8fd57a9 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 67866ecdcb..1ce0a85b4e 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 66c3045187..b77227a539 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 9361808870..57f1649add 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 17618ff6de..252d9b631d 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 f03b8f37a0..d133a7e9df 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 2367e41314..e6a53cf7bd 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 e48ad55a71..82d8983710 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 27397de216..33ed94b2ac 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 19c42a8807..d4a9f445a1 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 cb089a660f..097b686943 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 f9af594cd5..544e6f5470 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 364fe9a060..e9071a2fa4 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 daa9918e29..79f83873e1 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 509db1a4bf..f7993f0188 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 177f0ada76..eb6c318604 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 5328072982..4fb7cdfaba 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 20cbb863ee..456ac79ff6 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 8e7d057d8c..69b8c50eec 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 a65e63ee24..b70bc5e16c 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 c8051dda03..e9818fa96d 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 736caf4131..f43fb05de1 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 5ba68aafbe..97913dffea 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;
}