aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/game/missiveomat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/game/missiveomat.cpp')
-rw-r--r--engines/titanic/game/missiveomat.cpp268
1 files changed, 253 insertions, 15 deletions
diff --git a/engines/titanic/game/missiveomat.cpp b/engines/titanic/game/missiveomat.cpp
index 32ae24e319..b7eb3eda49 100644
--- a/engines/titanic/game/missiveomat.cpp
+++ b/engines/titanic/game/missiveomat.cpp
@@ -21,6 +21,8 @@
*/
#include "titanic/game/missiveomat.h"
+#include "titanic/core/room_item.h"
+#include "titanic/titanic.h"
namespace Titanic {
@@ -32,30 +34,42 @@ BEGIN_MESSAGE_MAP(CMissiveOMat, CGameObject)
ON_MESSAGE(LeaveViewMsg)
END_MESSAGE_MAP()
-CMissiveOMat::CMissiveOMat() : CGameObject(), _fieldBC(1),
- _fieldC0(0), _fieldC4(0), _fieldE0(-1) {
+CMissiveOMat::CMissiveOMat() : CGameObject(), _mode(1),
+ _totalMessages(0), _messageNum(0), _personIndex(-1) {
+ // Load data for the messages, their from and to names
+ loadArray(_welcomeMessages, "TEXT/MISSIVEOMAT/WELCOME", 3);
+ loadArray(_messages, "TEXT/MISSIVEOMAT/MESSAGES", 58);
+ loadArray(_from, "TEXT/MISSIVEOMAT/FROM", 58);
+ loadArray(_to, "TEXT/MISSIVEOMAT/TO", 58);
+}
+
+void CMissiveOMat::loadArray(CString *arr, const CString &resName, int count) {
+ Common::SeekableReadStream *s = g_vm->_filesManager->getResource(resName);
+ for (int idx = 0; idx < count; ++idx)
+ arr[idx] = readStringFromStream(s);
+ delete s;
}
void CMissiveOMat::save(SimpleFile *file, int indent) {
file->writeNumberLine(1, indent);
- file->writeNumberLine(_fieldBC, indent);
- file->writeNumberLine(_fieldC0, indent);
- file->writeNumberLine(_fieldC4, indent);
+ file->writeNumberLine(_mode, indent);
+ file->writeNumberLine(_totalMessages, indent);
+ file->writeNumberLine(_messageNum, indent);
file->writeQuotedLine(_string1, indent);
file->writeQuotedLine(_string2, indent);
- file->writeNumberLine(_fieldE0, indent);
+ file->writeNumberLine(_personIndex, indent);
CGameObject::save(file, indent);
}
void CMissiveOMat::load(SimpleFile *file) {
file->readNumber();
- _fieldBC = file->readNumber();
- _fieldC0 = file->readNumber();
- _fieldC4 = file->readNumber();
+ _mode = file->readNumber();
+ _totalMessages = file->readNumber();
+ _messageNum = file->readNumber();
_string1 = file->readString();
_string2 = file->readString();
- _fieldE0 = file->readNumber();
+ _personIndex = file->readNumber();
CGameObject::load(file);
}
@@ -67,25 +81,249 @@ bool CMissiveOMat::EnterViewMsg(CEnterViewMsg *msg) {
}
bool CMissiveOMat::KeyCharMsg(CKeyCharMsg *msg) {
- // TODO
+ CTreeItem *loginControl = findRoom()->findByName("MissiveOMat Login Control");
+ CTreeItem *welcome = findRoom()->findByName("MissiveOMat Welcome");
+ CTreeItem *scrollUp = findRoom()->findByName("MissiveOMat ScrollUp Button");
+ CEditControlMsg editMsg;
+
+ switch (_mode) {
+ case 1: {
+ playSound("z#228.wav");
+ editMsg._mode = 6;
+ editMsg._param = msg->_key;
+ editMsg.execute(loginControl);
+
+ if (editMsg._param == 1000) {
+ editMsg._mode = 3;
+ editMsg.execute(loginControl);
+
+ _string1 = editMsg._text;
+ if (!_string1.empty()) {
+ loadFrame(2);
+ _mode = 2;
+
+ editMsg._mode = 1;
+ editMsg.execute(loginControl);
+ editMsg._mode = 10;
+ editMsg._param = 24;
+ editMsg.execute(loginControl);
+ }
+ }
+ break;
+ }
+
+ case 2: {
+ playSound("z#228.wav");
+ editMsg._mode = 6;
+ editMsg._param = msg->_key;
+ editMsg.execute(loginControl);
+
+ _string2 = editMsg._text;
+ if (_string1 == "Droot Scraliontis") {
+ _string1 = "Scraliontis";
+ } else if (_string1 == "Antar Brobostigon") {
+ _string1 = "Brobostigon";
+ } else if (_string1 == "colin") {
+ _string1 = "Leovinus";
+ }
+
+ bool flag = false;
+ if (_string1 == "Leovinus") {
+ if (_string2 == "Other") {
+ flag = true;
+ _personIndex = 0;
+ }
+ } else if (_string1 == "Scraliontis") {
+ if (_string2 == "This") {
+ flag = true;
+ _personIndex = 1;
+ }
+ } else if (_string1 == "Brobostigon") {
+ if (_string2 == "That") {
+ flag = true;
+ _personIndex = 2;
+ }
+ }
+
+ if (flag) {
+ _mode = 4;
+ loadFrame(4);
+ editMsg._mode = 1;
+ editMsg.execute(loginControl);
+
+ getTextCursor()->hide();
+ editMsg._mode = 13;
+ editMsg.execute(loginControl);
+
+ editMsg._mode = 12;
+ editMsg.execute(welcome);
+
+ editMsg._mode = 2;
+ editMsg._text = _welcomeMessages[_personIndex];
+ editMsg.execute(welcome);
+
+ editMsg._mode = 12;
+ editMsg._text = "MissiveOMat OK Button";
+ editMsg.execute(welcome);
+ editMsg.execute(scrollUp);
+ } else {
+ _mode = 3;
+ loadFrame(3);
+ addTimer(1500);
+
+ editMsg._mode = 1;
+ editMsg.execute(loginControl);
+
+ getTextCursor()->hide();
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
return true;
}
bool CMissiveOMat::TimerMsg(CTimerMsg *msg) {
- if (_fieldBC == 3) {
- // TODO
+ if (_mode == 3) {
+ CTreeItem *loginControl = findRoom()->findByName("MissiveOMat Login Control");
+ CEditControlMsg editMsg;
+ editMsg._mode = 10;
+ editMsg._param = 8;
+ editMsg.execute(loginControl);
}
return true;
}
bool CMissiveOMat::MissiveOMatActionMsg(CMissiveOMatActionMsg *msg) {
- // TODO
+ CTreeItem *welcome = findByName("MissiveOMat Welcome");
+
+ switch (msg->_action) {
+ case MESSAGE_SHOW: {
+ CTreeItem *btnOk = findRoom()->findByName("MissiveOMat OK Button");
+ CTreeItem *btnNext = findRoom()->findByName("MissiveOMat Next Button");
+ CTreeItem *btnPrev = findRoom()->findByName("MissiveOMat Prev Button");
+ CTreeItem *btnLogout = findRoom()->findByName("MissiveOMat Logout Button");
+
+ _mode = MESSAGE_5;
+ CVisibleMsg visibleMsg;
+ visibleMsg._visible = false;
+ visibleMsg.execute(btnOk);
+ visibleMsg._visible = true;
+ visibleMsg.execute(btnNext);
+ visibleMsg.execute(btnPrev);
+ visibleMsg.execute(btnLogout);
+
+ _messageNum = 0;
+ _totalMessages = 0;
+ CString *strP = &_messages[_personIndex * 19];
+ for (_totalMessages = 0; !strP->empty(); ++strP, ++_totalMessages)
+ ;
+
+ CMissiveOMatActionMsg actionMsg;
+ actionMsg._action = REDRAW_MESSAGE;
+ actionMsg.execute(this);
+ break;
+ }
+
+ case NEXT_MESSAGE:
+ if (_messageNum < (_totalMessages - 1)) {
+ ++_messageNum;
+ CMissiveOMatActionMsg actionMsg;
+ actionMsg._action = REDRAW_MESSAGE;
+ actionMsg.execute(this);
+ }
+ break;
+
+ case PRIOR_MESSAGE:
+ if (_messageNum > 0) {
+ --_messageNum;
+ CMissiveOMatActionMsg actionMsg;
+ actionMsg._action = REDRAW_MESSAGE;
+ actionMsg.execute(this);
+ }
+ break;
+
+ case MESSAGE_5: {
+ CMissiveOMatActionMsg actionMsg;
+ actionMsg._action = MESSAGE_9;
+ actionMsg.execute(this);
+ break;
+ }
+
+ case MESSAGE_DOWN:
+ if (welcome)
+ scrollTextDown();
+ break;
+
+ case MESSAGE_UP:
+ if (welcome)
+ scrollTextUp();
+ break;
+
+ case REDRAW_MESSAGE:
+ if (welcome) {
+ CString str = CString::format(
+ "Missive %d of %d.\nFrom: %s\nTo: %s\n\n%s\n",
+ _messageNum + 1, _totalMessages, _from[_messageNum],
+ _to[_messageNum], _messages[_messageNum]);
+
+ setText(str);
+ }
+ break;
+
+ case MESSAGE_9: {
+ loadFrame(1);
+ _mode = MESSAGE_NONE;
+ _personIndex = -1;
+
+ static const char *const WIDGETS[7] = {
+ "MissiveOMat Login Control", "MissiveOMat OK Button",
+ "MissiveOMat Next Button", "MissiveOMat Prev Button",
+ "MissiveOMat Logout Button", "MissiveOMat ScrollDown Button",
+ "MissiveOMat ScrollUp Button"
+ };
+ CEditControlMsg editMsg;
+
+ for (int idx = 0; idx < 7; ++idx) {
+ editMsg._mode = 0;
+ editMsg._param = 12;
+ editMsg.execute(WIDGETS[idx]);
+ editMsg._mode = 1;
+ editMsg.execute(WIDGETS[idx]);
+ editMsg._mode = 13;
+ editMsg.execute(WIDGETS[idx]);
+ }
+
+ editMsg._mode = 12;
+ editMsg.execute("MissiveOMat Login Control");
+ editMsg._mode = 10;
+ editMsg._param = 8;
+ editMsg.execute("MissiveOMat Login Control");
+ editMsg._mode = 8;
+ editMsg.execute("MissiveOMat Login Control");
+
+ _string1.clear();
+ _string2.clear();
+ break;
+ }
+
+ default:
+ break;
+ }
+
return true;
}
bool CMissiveOMat::LeaveViewMsg(CLeaveViewMsg *msg) {
- // TODO
+ CEditControlMsg editMsg;
+ editMsg._mode = 9;
+ editMsg.execute("MissiveOMat Login Control");
+ petShowCursor();
+
return true;
}