aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/titanic/core/game_object.cpp2
-rw-r--r--engines/titanic/core/game_object.h4
-rw-r--r--engines/titanic/game/missiveomat.cpp268
-rw-r--r--engines/titanic/game/missiveomat.h21
-rw-r--r--engines/titanic/gfx/edit_control.cpp4
-rw-r--r--engines/titanic/messages/messages.h2
6 files changed, 276 insertions, 25 deletions
diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp
index 3126aac228..0289e78823 100644
--- a/engines/titanic/core/game_object.cpp
+++ b/engines/titanic/core/game_object.cpp
@@ -1066,7 +1066,7 @@ void CGameObject::setMovieFrameRate(double rate) {
_surface->setMovieFrameRate(rate);
}
-void CGameObject::setTextBorder(const CString &str, int border, int borderRight) {
+void CGameObject::setText(const CString &str, int border, int borderRight) {
if (!_text)
_text = new CPetText();
_textBorder = border;
diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h
index d089ce5ed0..53e26b5f6b 100644
--- a/engines/titanic/core/game_object.h
+++ b/engines/titanic/core/game_object.h
@@ -491,9 +491,9 @@ protected:
void setMovieFrameRate(double rate);
/**
- * Set up the text borders for the object
+ * Set up the text and borders for the object
*/
- void setTextBorder(const CString &str, int border = 0, int borderRight = 0);
+ void setText(const CString &str, int border = 0, int borderRight = 0);
/**
* Sets whether the text will use borders
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;
}
diff --git a/engines/titanic/game/missiveomat.h b/engines/titanic/game/missiveomat.h
index c4913deaa0..9810fcc403 100644
--- a/engines/titanic/game/missiveomat.h
+++ b/engines/titanic/game/missiveomat.h
@@ -27,6 +27,12 @@
namespace Titanic {
+enum MissiveOMatAction {
+ MESSAGE_NONE = 1, MESSAGE_SHOW = 2, NEXT_MESSAGE = 3, PRIOR_MESSAGE = 4,
+ MESSAGE_5 = 5, MESSAGE_DOWN = 6, MESSAGE_UP = 7, REDRAW_MESSAGE = 8,
+ MESSAGE_9 = 9
+};
+
class CMissiveOMat : public CGameObject {
DECLARE_MESSAGE_MAP;
bool EnterViewMsg(CEnterViewMsg *msg);
@@ -34,13 +40,20 @@ class CMissiveOMat : public CGameObject {
bool TimerMsg(CTimerMsg *msg);
bool MissiveOMatActionMsg(CMissiveOMatActionMsg *msg);
bool LeaveViewMsg(CLeaveViewMsg *msg);
+private:
+ CString _welcomeMessages[3];
+ CString _messages[58];
+ CString _from[58];
+ CString _to[58];
+private:
+ void loadArray(CString *arr, const CString &resName, int count);
public:
- int _fieldBC;
- int _fieldC0;
- int _fieldC4;
+ int _mode;
+ int _totalMessages;
+ int _messageNum;
CString _string1;
CString _string2;
- int _fieldE0;
+ int _personIndex;
public:
CLASSDEF;
CMissiveOMat();
diff --git a/engines/titanic/gfx/edit_control.cpp b/engines/titanic/gfx/edit_control.cpp
index 4098220c3a..3f3c4d4035 100644
--- a/engines/titanic/gfx/edit_control.cpp
+++ b/engines/titanic/gfx/edit_control.cpp
@@ -190,8 +190,8 @@ bool CEditControl::EditControlMsg(CEditControlMsg *msg) {
case 14: {
makeDirty();
- CString borderName = _fieldF4 ? CString('*', _text.size()) : _text;
- setTextBorder(borderName);
+ CString str = _fieldF4 ? CString('*', _text.size()) : _text;
+ setText(str);
int textWidth = getTextWidth();
if (_fieldF0 == 2) {
diff --git a/engines/titanic/messages/messages.h b/engines/titanic/messages/messages.h
index fa05416fdc..82e9a55c40 100644
--- a/engines/titanic/messages/messages.h
+++ b/engines/titanic/messages/messages.h
@@ -245,7 +245,7 @@ MESSAGE1(CLoadSuccessMsg, int, ticks, 0);
MESSAGE1(CLockPhonographMsg, int, value, 0);
MESSAGE0(CMaitreDDefeatedMsg);
MESSAGE0(CMaitreDHappyMsg);
-MESSAGE1(CMissiveOMatActionMsg, int, value, 0);
+MESSAGE1(CMissiveOMatActionMsg, int, action, 0);
MESSAGE0(CMoveToStartPosMsg);
MESSAGE2(CMovieEndMsg, int, startFrame, 0, int, endFrame, 0);
MESSAGE2(CMovieFrameMsg, int, frameNumber, 0, int, value2, 0);