aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/npcs/barbot.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2016-08-13 15:09:57 -0400
committerPaul Gilbert2016-08-13 15:09:57 -0400
commit786f2ca4487ea852bf3f4b95dbafc8499ed526cb (patch)
tree7369c693a1f66272e2f8c9f9f64cc8b6ba0fd9dd /engines/titanic/npcs/barbot.cpp
parentbbc9e072271e787dd151f24f4b4c43a0528c5ee3 (diff)
downloadscummvm-rg350-786f2ca4487ea852bf3f4b95dbafc8499ed526cb.tar.gz
scummvm-rg350-786f2ca4487ea852bf3f4b95dbafc8499ed526cb.tar.bz2
scummvm-rg350-786f2ca4487ea852bf3f4b95dbafc8499ed526cb.zip
TITANIC: Implementing CBarbot game object class
Diffstat (limited to 'engines/titanic/npcs/barbot.cpp')
-rw-r--r--engines/titanic/npcs/barbot.cpp596
1 files changed, 444 insertions, 152 deletions
diff --git a/engines/titanic/npcs/barbot.cpp b/engines/titanic/npcs/barbot.cpp
index 079e8fe10b..dace1741fa 100644
--- a/engines/titanic/npcs/barbot.cpp
+++ b/engines/titanic/npcs/barbot.cpp
@@ -21,6 +21,7 @@
*/
#include "titanic/npcs/barbot.h"
+#include "titanic/titanic.h"
namespace Titanic {
@@ -41,8 +42,22 @@ BEGIN_MESSAGE_MAP(CBarbot, CTrueTalkNPC)
ON_MESSAGE(LoadSuccessMsg)
ON_MESSAGE(MovieFrameMsg)
ON_MESSAGE(EnterRoomMsg)
+ ON_MESSAGE(TimerMsg)
END_MESSAGE_MAP()
+CBarbot::FrameRanges::FrameRanges() : Common::Array<FrameRange>() {
+ resize(60);
+ Common::SeekableReadStream *stream = g_vm->_filesManager->getResource("FRAMES/BARBOT");
+ for (int idx = 0; idx < 60; ++idx) {
+ (*this)[idx]._startFrame = stream->readUint32LE();
+ (*this)[idx]._endFrame = stream->readUint32LE();
+ }
+
+ delete stream;
+}
+
+/*------------------------------------------------------------------------*/
+
CBarbot::CBarbot() : CTrueTalkNPC() {
_field108 = 0;
_field10C = 0;
@@ -58,8 +73,8 @@ CBarbot::CBarbot() : CTrueTalkNPC() {
_field134 = 0;
_field138 = 0;
_field13C = -1;
- _field140 = 30;
- _field144 = -1;
+ _volume = 30;
+ _frameNum = -1;
_field148 = -1;
_field14C = 0;
_field150 = 0;
@@ -67,125 +82,6 @@ CBarbot::CBarbot() : CTrueTalkNPC() {
_field158 = -1;
_field15C = 0;
_field160 = 0;
- _field164 = 558;
- _field168 = 585;
- _field16C = 659;
- _field170 = 692;
- _field174 = 802;
- _field178 = 816;
- _field17C = 1941;
- _field180 = 1977;
- _field184 = 1901;
- _field188 = 1941;
- _field18C = 810;
- _field190 = 816;
- _field194 = 857;
- _field198 = 865;
- _field19C = 842;
- _field1A0 = 857;
- _field1A4 = 821;
- _field1A8 = 842;
- _field1AC = 682;
- _field1B0 = 692;
- _field1B4 = 1977;
- _field1B8 = 2018;
- _field1BC = 2140;
- _field1C0 = 2170;
- _field1C4 = 2101;
- _field1C8 = 2139;
- _field1CC = 2018;
- _field1D0 = 2099;
- _field1D4 = 1902;
- _field1D8 = 2015;
- _field1E0 = 1811;
- _field1E4 = 1901;
- _field1E8 = 1810;
- _field1EC = 1703;
- _field1F0 = 1750;
- _field1F4 = 1681;
- _field1F8 = 1702;
- _field1FC = 1642;
-
- _field200 = 1702;
- _field204 = 1571;
- _field208 = 1641;
- _field20C = 1499;
- _field210 = 1570;
- _field214 = 1403;
- _field218 = 1463;
- _field21C = 1464;
- _field220 = 1499;
- _field224 = 1288;
- _field228 = 1295;
- _field22C = 1266;
- _field230 = 1287;
- _field234 = 1245;
- _field238 = 1265;
- _field23C = 1208;
- _field240 = 1244;
- _field244 = 1171;
- _field248 = 1207;
- _field24C = 1120;
- _field250 = 1170;
- _field254 = 1092;
- _field258 = 1120;
- _field25C = 1092;
- _field260 = 1092;
- _field264 = 1044;
- _field268 = 1091;
- _field26C = 1011;
- _field270 = 1043;
- _field274 = 1001;
- _field278 = 1010;
- _field27C = 985;
- _field280 = 1001;
- _field284 = 927;
- _field288 = 984;
- _field28C = 912;
- _field290 = 926;
- _field294 = 898;
- _field298 = 906;
- _field29C = 802;
- _field2A0 = 896;
- _field2A4 = 865;
- _field2A8 = 896;
- _field2AC = 842;
- _field2B0 = 865;
- _field2B4 = 816;
- _field2B8 = 842;
- _field2BC = 802;
- _field2C0 = 842;
- _field2C4 = 740;
- _field2C8 = 740;
- _field2CC = 740;
- _field2D0 = 692;
- _field2D4 = 610;
- _field2D8 = 558;
- _field2E0 = 610;
- _field2E4 = 500;
- _field2E8 = 558;
- _field2EC = 467;
- _field2F0 = 500;
- _field2F4 = 421;
- _field2F8 = 466;
- _field2FC = 349;
- _field300 = 306;
- _field304 = 306;
- _field308 = 348;
- _field30C = 305;
- _field310 = 306;
- _field314 = 281;
- _field318 = 305;
- _field31C = 202;
- _field320 = 281;
- _field324 = 182;
- _field328 = 202;
- _field32C = 165;
- _field330 = 182;
- _field334 = 96;
- _field338 = 165;
- _field33C = 0;
- _field340 = 95;
}
void CBarbot::save(SimpleFile *file, int indent) {
@@ -206,8 +102,8 @@ void CBarbot::save(SimpleFile *file, int indent) {
file->writeNumberLine(_field134, indent);
file->writeNumberLine(_field138, indent);
file->writeNumberLine(_field13C, indent);
- file->writeNumberLine(_field140, indent);
- file->writeNumberLine(_field144, indent);
+ file->writeNumberLine(_volume, indent);
+ file->writeNumberLine(_frameNum, indent);
file->writeNumberLine(_field148, indent);
file->writeNumberLine(_field14C, indent);
file->writeNumberLine(_field150, indent);
@@ -237,8 +133,8 @@ void CBarbot::load(SimpleFile *file) {
_field134 = file->readNumber();
_field138 = file->readNumber();
_field13C = file->readNumber();
- _field140 = file->readNumber();
- _field144 = file->readNumber();
+ _volume = file->readNumber();
+ _frameNum = file->readNumber();
_field148 = file->readNumber();
_field14C = file->readNumber();
_field150 = file->readNumber();
@@ -251,28 +147,234 @@ void CBarbot::load(SimpleFile *file) {
}
bool CBarbot::ActMsg(CActMsg *msg) {
- // TODO
- return false;
+ if (msg->_action == "Vodka") {
+ if (!_field12C) {
+ playRange(_frames[47], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[46]);
+ playRange(_frames[40]);
+ playRange(_frames[7]);
+ playRange(_frames[13]);
+ playRange(_frames[8]);
+ playRange(_frames[40]);
+ playRange(_frames[7]);
+ playRange(_frames[13]);
+ playRange(_frames[8]);
+ playRange(_frames[7]);
+ playRange(_frames[40]);
+ playRange(_frames[13]);
+ playRange(_frames[40]);
+ playRange(_frames[7]);
+ playRange(_frames[8]);
+ playRange(_frames[13]);
+ playRange(_frames[40], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+ _frameNum = _frames[40]._endFrame;
+ }
+ } else if (msg->_action == "GiveBackVisCentre") {
+ if (_field134) {
+ playRange(_frames[27]);
+ _frameNum = _frames[27]._endFrame;
+ }
+ } else if (msg->_action == "Bird") {
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 2;
+ statusMsg.execute("PickUpGlass");
+ _field158 = 3;
+
+ playRange(_frames[32], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[30], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[30]._endFrame;
+
+ if (!_field114 || !_field118 || !_field12C) {
+ playRange(_frames[42], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[42]._endFrame;
+ }
+
+ CActMsg actMsg("InTitilator");
+ actMsg.execute("BeerGlass");
+ } else if (msg->_action == "None") {
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 2;
+ statusMsg.execute("PickUpGlass");
+ _field158 = 0;
+
+ playRange(_frames[55], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[54], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[54]._endFrame;
+ } else if (msg->_action == "Mustard" || msg->_action == "Tomato") {
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 2;
+ statusMsg.execute("PickUpGlass");
+ _field158 = 1;
+
+ playRange(_frames[55], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[54], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[54]._endFrame;
+
+ CActMsg actMsg("InTitilator");
+ actMsg.execute("BeerGlass");
+ } else if (msg->_action == "Fruit") {
+ if (!_field114) {
+ CActMsg visibleMsg;
+ visibleMsg.execute("LemonOnBar");
+ startTalking(this, 250576);
+ _field114 = 1;
+
+ playRange(_frames[36], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[36]._endFrame;
+
+ if (!_field11C || !_field118 || _field12C) {
+ playRange(_frames[43], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[43]._endFrame;
+ }
+
+ CRemoveFromGameMsg removeMsg;
+ removeMsg.execute("Lemon");
+ }
+ } else if (msg->_action == "CrushedTV") {
+ if (!_field118) {
+ CVisibleMsg visibleMsg;
+ visibleMsg.execute("TVOnBar");
+ startTalking(this, 250584);
+ _field160 = 1;
+
+ playSound("c#5.wav", _volume);
+ playRange(_frames[35], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[34]);
+ playRange(_frames[33], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[33]._endFrame;
+
+ if (!_field11C || !_field114 || !_field12C) {
+ playRange(_frames[41], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[41]._endFrame;
+ }
+
+ CRemoveFromGameMsg removeMsg;
+ removeMsg.execute("CrushedTV");
+ }
+ } else if (msg->_action == "PlayerTakesGlass") {
+ playRange(_frames[53]);
+ _field124 = 0;
+
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 0;
+ statusMsg.execute("PickUpGlass");
+ } else if (msg->_action == "PlayerTakesVisCentre") {
+ _field128 = 0;
+ loadFrame(0);
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 0;
+ statusMsg.execute("PickUpVisCentre");
+ } else if (msg->_action == "BellRing1") {
+ startTalking(this, 251105);
+ } else if (msg->_action == "BellRing2") {
+ startTalking(this, 251107);
+ } else if (msg->_action == "BellRing3") {
+ startTalking(this, 250285);
+ } else if (msg->_action == "GoRingBell") {
+ startTalking(this, 250285);
+ } else if (msg->_action == "ClickOnVision") {
+ startTalking(this, 251858);
+ }
+
+ return true;
}
bool CBarbot::EnterViewMsg(CEnterViewMsg *msg) {
- // TODO
- return false;
+ // I think this is a remnant of early debugging code
+ if (getName() != "Barbot")
+ playMovie(MOVIE_REPEAT);
+
+ return true;
+}
+
+bool CBarbot::EnterRoomMsg(CEnterRoomMsg *msg) {
+ // I think this is a remnant of early debugging code
+ if (getName() != "Barbot")
+ addTimer(g_vm->getRandomNumber(20000));
+
+ return true;
}
bool CBarbot::TurnOn(CTurnOn *msg) {
- // TODO
- return false;
+ if (!_fieldC4) {
+ _field13C = -1;
+ setVisible(true);
+
+ CGameObject *glass = findInRoom("BeerGlass");
+ if (!_field130) {
+ CVisibleMsg visibleMsg(false);
+ visibleMsg.execute("BarShelfVisCentre");
+ }
+
+ if (glass && !_field11C) {
+ playRange(_frames[38], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[58], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[57], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[56], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+ _frameNum = _frames[56]._endFrame;
+ } else {
+ playRange(_frames[38]);
+ playRange(_frames[23], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[21], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[21]._endFrame;
+
+ switch (g_vm->getRandomNumber(2)) {
+ case 0:
+ playRange(_frames[10], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[10]._endFrame;
+ break;
+ case 1:
+ playRange(_frames[12], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[12]._endFrame;
+ break;
+ default:
+ break;
+ }
+ _field124 = 0;
+ }
+
+ _fieldC4 = 1;
+ ++_v0;
+ petSetArea(PET_CONVERSATION);
+ endTalking(this, true);
+ }
+
+ return true;
}
bool CBarbot::TurnOff(CTurnOff *msg) {
- // TODO
- return false;
+ if (_fieldC4) {
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 0;
+ statusMsg.execute("PickUpGlass");
+ statusMsg.execute("PickUpVisCentre");
+
+ if (_field124) {
+ playRange(_frames[17], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[17]._endFrame;
+ _field124 = 0;
+ }
+
+ if (_field128) {
+ playRange(_frames[28], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+ _frameNum = _frames[28]._endFrame;
+ _field128 = 0;
+ _field134 = 1;
+ }
+
+ playRange(_frames[29], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+ movieEvent(_frames[29]._startFrame);
+ _frameNum = _frames[29]._endFrame;
+ _fieldC4 = 0;
+ }
+
+ return true;
}
bool CBarbot::LeaveViewMsg(CLeaveViewMsg *msg) {
- // TODO
- return false;
+ CTurnOff offMsg;
+ offMsg.execute(this);
+ return true;
}
bool CBarbot::MovieEndMsg(CMovieEndMsg *msg) {
@@ -281,43 +383,233 @@ bool CBarbot::MovieEndMsg(CMovieEndMsg *msg) {
}
bool CBarbot::TrueTalkSelfQueueAnimSetMsg(CTrueTalkSelfQueueAnimSetMsg *msg) {
- // TODO
- return false;
+ return true;
}
bool CBarbot::TrueTalkQueueUpAnimSetMsg(CTrueTalkQueueUpAnimSetMsg *msg) {
- // TODO
- return false;
+ return true;
}
bool CBarbot::TrueTalkGetStateValueMsg(CTrueTalkGetStateValueMsg *msg) {
- // TODO
- return false;
+ switch (msg->_stateNum) {
+ case 2:
+ if (!_field130) {
+ if (_field15C) {
+ msg->_stateVal = _field134 | 1;
+ return true;
+ }
+ }
+
+ msg->_stateVal = _field134;
+ break;
+
+ case 3:
+ msg->_stateVal = 0;
+ if (_field114)
+ msg->_stateVal = 1;
+ if (_field11C)
+ msg->_stateVal |= 4;
+ if (_field118)
+ msg->_stateVal |= 8;
+ if (_field12C)
+ msg->_stateVal |= 2;
+ break;
+
+ case 9:
+ msg->_stateVal = _field15C ? 1 : 0;
+ break;
+
+ default:
+ break;
+ }
+
+ return true;
}
bool CBarbot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) {
- // TODO
- return false;
+ switch (msg->_action) {
+ case 6:
+ if (_field134) {
+ playRange(_frames[27], MOVIE_NOTIFY_OBJECT);
+ _frameNum = _frames[27]._endFrame;
+ } else if (!_field130 && _field15C) {
+ playRange(_frames[45], MOVIE_NOTIFY_OBJECT);
+ playRange(_frames[44], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE);
+ _frameNum = _frames[44]._endFrame;
+ }
+ break;
+
+ case 7: {
+ CActMsg actMsg("Vodka");
+ actMsg.execute(this);
+ break;
+ }
+
+ case 30:
+ _field11C = 1;
+ break;
+
+ default:
+ break;
+ }
+
+ return true;
}
bool CBarbot::FrameMsg(CFrameMsg *msg) {
- // TODO
- return false;
+ if (!_fieldC4 || _frameNum != -1 || _field148 != -1
+ || (msg->_ticks - _field14C) <= 5000
+ || (msg->_ticks - _field150) <= 1000)
+ return true;
+
+ if (!_field15C) {
+ if (++_field154 > 2) {
+ playRange(_frames[0]);
+ playRange(_frames[1], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[1]._endFrame;
+ _field154 = 0;
+
+ return true;
+ }
+
+ switch (g_vm->getRandomNumber(5)) {
+ case 0:
+ playRange(_frames[4], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[4]._endFrame;
+ break;
+
+ case 1:
+ playRange(_frames[10], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[10]._endFrame;
+ break;
+
+ case 2:
+ playRange(_frames[7], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[7]._endFrame;
+ break;
+
+ case 3:
+ playRange(_frames[0]);
+ playRange(_frames[1], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[1]._endFrame;
+ break;
+
+ case 4:
+ playRange(_frames[3], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[3]._endFrame;
+ break;
+
+ case 5:
+ if (!_field160 && !_field128) {
+ playRange(_frames[15], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[15]._endFrame;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ static const int CASES[23] = {
+ 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7
+ };
+ switch (CASES[g_vm->getRandomNumber(22)]) {
+ case 0:
+ playRange(_frames[13], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[13]._endFrame;
+ break;
+
+ case 1:
+ playRange(_frames[4], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[4]._endFrame;
+ break;
+
+ case 2:
+ playRange(_frames[8], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[8]._endFrame;
+ break;
+
+ case 3:
+ playRange(_frames[7], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[7]._endFrame;
+ break;
+
+ case 4:
+ playRange(_frames[10], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[10]._endFrame;
+ break;
+
+ case 5:
+ playRange(_frames[2], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[2]._endFrame;
+ break;
+
+ case 6:
+ playRange(_frames[6], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[6]._endFrame;
+ break;
+
+ default:
+ playRange(_frames[3], MOVIE_NOTIFY_OBJECT);
+ _field148 = _frames[3]._endFrame;
+ break;
+ }
+ }
+
+ return true;
}
bool CBarbot::LoadSuccessMsg(CLoadSuccessMsg *msg) {
- // TODO
- return false;
+ _field14C = _field150 = g_vm->_events->getTicksCount();
+ _frameNum = -1;
+ _field148 = -1;
+
+ return true;
}
bool CBarbot::MovieFrameMsg(CMovieFrameMsg *msg) {
- // TODO
- return false;
+ if (msg->_frameNumber == _frames[29]._startFrame) {
+ playSound("c#2.wav", _volume);
+
+ } else if (msg->_frameNumber == _frames[55]._startFrame
+ || msg->_frameNumber == _frames[32]._startFrame) {
+ CStatusChangeMsg statusMsg;
+ statusMsg._newStatus = 0;
+ statusMsg.execute("PickUpGlass");
+
+ if (_field158 == 0) {
+ startTalking(this, 250574);
+ } else if (_field158 > 0 && _field158 <= 3) {
+ startTalking(this, 250580);
+ petSetArea(PET_CONVERSATION);
+ }
+
+ _field158 = -1;
+
+ } else if (msg->_frameNumber == _frames[36]._startFrame) {
+ CVisibleMsg visibleMsg(false);
+ visibleMsg.execute("LemonOnBar");
+
+ } else if (msg->_frameNumber == _frames[35]._startFrame) {
+ CVisibleMsg visibleMsg(false);
+ visibleMsg.execute("TVOnBar");
+ }
+
+ return true;
}
-bool CBarbot::EnterRoomMsg(CEnterRoomMsg *msg) {
- // TODO
- return false;
+bool CBarbot::TimerMsg(CTimerMsg *msg) {
+ if (!_fieldC4 && compareRoomNameTo("Bar")) {
+ CParrotSpeakMsg speakMsg("Barbot", "AskForDrink");
+ speakMsg.execute("PerchedParrot");
+ addTimer(10000 + g_vm->getRandomNumber(20000));
+ }
+
+ return true;
+}
+
+void CBarbot::playRange(const FrameRange &range, uint flags) {
+ playMovie(range._startFrame, range._endFrame, flags);
}
} // End of namespace Titanic