diff options
author | Paul Gilbert | 2016-08-24 21:20:03 -0400 |
---|---|---|
committer | Paul Gilbert | 2016-08-24 21:20:03 -0400 |
commit | e81e3aefde040a9a8e133c3c1059ea66e9d91db5 (patch) | |
tree | 07e7f9bbba00462b30bd7a7a5d4b185205e0139c | |
parent | 456ed176716432b8c54fae5ed252db07d1c71dd7 (diff) | |
download | scummvm-rg350-e81e3aefde040a9a8e133c3c1059ea66e9d91db5.tar.gz scummvm-rg350-e81e3aefde040a9a8e133c3c1059ea66e9d91db5.tar.bz2 scummvm-rg350-e81e3aefde040a9a8e133c3c1059ea66e9d91db5.zip |
TITANIC: Implemented CMissiveOMat class
-rw-r--r-- | engines/titanic/core/game_object.cpp | 2 | ||||
-rw-r--r-- | engines/titanic/core/game_object.h | 4 | ||||
-rw-r--r-- | engines/titanic/game/missiveomat.cpp | 268 | ||||
-rw-r--r-- | engines/titanic/game/missiveomat.h | 21 | ||||
-rw-r--r-- | engines/titanic/gfx/edit_control.cpp | 4 | ||||
-rw-r--r-- | engines/titanic/messages/messages.h | 2 |
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); |