Skip to content

Commit

Permalink
TITANIC: Implemented CMissiveOMat class
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Aug 25, 2016
1 parent 456ed17 commit e81e3ae
Show file tree
Hide file tree
Showing 6 changed files with 276 additions and 25 deletions.
2 changes: 1 addition & 1 deletion engines/titanic/core/game_object.cpp
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions engines/titanic/core/game_object.h
Expand Up @@ -491,9 +491,9 @@ class CGameObject : public CNamedItem {
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
Expand Down
268 changes: 253 additions & 15 deletions engines/titanic/game/missiveomat.cpp
Expand Up @@ -21,6 +21,8 @@
*/

#include "titanic/game/missiveomat.h"
#include "titanic/core/room_item.h"
#include "titanic/titanic.h"

namespace Titanic {

Expand All @@ -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);
}
Expand All @@ -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;
}

Expand Down
21 changes: 17 additions & 4 deletions engines/titanic/game/missiveomat.h
Expand Up @@ -27,20 +27,33 @@

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);
bool KeyCharMsg(CKeyCharMsg *msg);
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();
Expand Down
4 changes: 2 additions & 2 deletions engines/titanic/gfx/edit_control.cpp
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion engines/titanic/messages/messages.h
Expand Up @@ -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);
Expand Down

0 comments on commit e81e3ae

Please sign in to comment.