diff options
author | Paul Gilbert | 2016-03-28 22:25:15 -0400 |
---|---|---|
committer | Paul Gilbert | 2016-03-28 22:25:15 -0400 |
commit | 471737a41a4f75a65ed0f7e49f6b30e361232bae (patch) | |
tree | 8d5642719aa2d4cf37ffc761052bc0dfe0c674b8 /engines | |
parent | 73204984098c96ecc28a1367a5da9613e7103a35 (diff) | |
download | scummvm-rg350-471737a41a4f75a65ed0f7e49f6b30e361232bae.tar.gz scummvm-rg350-471737a41a4f75a65ed0f7e49f6b30e361232bae.tar.bz2 scummvm-rg350-471737a41a4f75a65ed0f7e49f6b30e361232bae.zip |
TITANIC: Implemented CCDROM and various support stuff
Diffstat (limited to 'engines')
-rw-r--r-- | engines/titanic/core/background.cpp | 12 | ||||
-rw-r--r-- | engines/titanic/core/background.h | 10 | ||||
-rw-r--r-- | engines/titanic/core/game_object.cpp | 38 | ||||
-rw-r--r-- | engines/titanic/core/game_object.h | 28 | ||||
-rw-r--r-- | engines/titanic/core/saveable_object.cpp | 2 | ||||
-rw-r--r-- | engines/titanic/core/tree_item.cpp | 5 | ||||
-rw-r--r-- | engines/titanic/core/tree_item.h | 5 | ||||
-rw-r--r-- | engines/titanic/game/cdrom.cpp | 42 | ||||
-rw-r--r-- | engines/titanic/game/cdrom.h | 15 | ||||
-rw-r--r-- | engines/titanic/game/cdrom_tray.cpp | 6 | ||||
-rw-r--r-- | engines/titanic/game/cdrom_tray.h | 4 | ||||
-rw-r--r-- | engines/titanic/game/television.cpp | 12 | ||||
-rw-r--r-- | engines/titanic/messages/messages.h | 1 | ||||
-rw-r--r-- | engines/titanic/messages/mouse_messages.h | 6 |
14 files changed, 155 insertions, 31 deletions
diff --git a/engines/titanic/core/background.cpp b/engines/titanic/core/background.cpp index 63aaf30ae0..ea3bdb01a8 100644 --- a/engines/titanic/core/background.cpp +++ b/engines/titanic/core/background.cpp @@ -49,4 +49,16 @@ void CBackground::load(SimpleFile *file) { CGameObject::load(file); } +bool CBackground::handleMessage(CStatusChangeMsg &msg) { + error("TODO: CBackground::handleMessage"); +} + +bool CBackground::handleMessage(CSetFrameMsg &msg) { + error("TODO: CBackground::handleMessage"); +} + +bool CBackground::handleMessage(CVisibleMsg &msg) { + error("TODO: CBackground::handleMessage"); +} + } // End of namespace Titanic diff --git a/engines/titanic/core/background.h b/engines/titanic/core/background.h index 4ce5651fc4..bd8f94987e 100644 --- a/engines/titanic/core/background.h +++ b/engines/titanic/core/background.h @@ -24,16 +24,24 @@ #define TITANIC_BACKGROUND_H #include "titanic/core/game_object.h" +#include "titanic/messages/messages.h" namespace Titanic { -class CBackground : public CGameObject { +class CBackground : public CGameObject, + public CStatusChangeMsgTarget, + public CSetFrameMsgTarget, + public CVisibleMsgTarget { protected: int _fieldBC; int _fieldC0; CString _string1; CString _string2; int _fieldDC; +protected: + virtual bool handleMessage(CStatusChangeMsg &msg); + virtual bool handleMessage(CSetFrameMsg &msg); + virtual bool handleMessage(CVisibleMsg &msg); public: CLASSDEF CBackground(); diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp index a215633932..834364591d 100644 --- a/engines/titanic/core/game_object.cpp +++ b/engines/titanic/core/game_object.cpp @@ -45,7 +45,7 @@ CGameObject::CGameObject(): CNamedItem() { _field50 = 0; _field54 = 0; _field58 = 0; - _field5C = true; + _visible = true; _field60 = 0; _cursorId = CURSOR_1; _field78 = 0; @@ -54,8 +54,6 @@ CGameObject::CGameObject(): CNamedItem() { _field94 = 0; _field98 = 0; _field9C = 0; - _fieldA0 = 0; - _fieldA4 = 0; _surface = nullptr; _fieldB8 = 0; } @@ -106,7 +104,7 @@ void CGameObject::load(SimpleFile *file) { _field48 = file->readNumber(); _field4C = file->readNumber(); _fieldB8 = file->readNumber(); - _field5C = file->readNumber() != 0; + _visible = file->readNumber() != 0; _field50 = file->readNumber(); _field54 = file->readNumber(); _field58 = file->readNumber(); @@ -137,7 +135,7 @@ bool CGameObject::checkPoint(const Point &pt, int v0, int v1) { } void CGameObject::draw(CScreenManager *screenManager) { - if (!_field5C) + if (!_visible) return; if (_v1) { error("TODO: Block in CGameObject::draw"); @@ -276,9 +274,9 @@ void CGameObject::soundFn2(int val, int val2) { } } -void CGameObject::set5C(bool val) { - if (val != _field5C) { - _field5C = val; +void CGameObject::setVisible(bool val) { + if (val != _visible) { + _visible = val; makeDirty(); } } @@ -320,4 +318,28 @@ void CGameObject::changeStatus(int newStatus) { } } +void CGameObject::savePosition() { + _savedPos = _bounds; +} + +void CGameObject::resetPosition() { + setPosition(_savedPos); +} + +void CGameObject::setPosition(const Common::Point &newPos) { + makeDirty(); + _bounds.moveTo(newPos); + makeDirty(); +} + +bool CGameObject::checkStartDragging(CMouseDragStartMsg *msg) { + if (_visible && checkPoint(msg->_mousePos, msg->_field14, 1)) { + savePosition(); + msg->_dragItem = this; + return true; + } else { + return false; + } +} + } // End of namespace Titanic diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h index 2f56f599a0..ced8663ed3 100644 --- a/engines/titanic/core/game_object.h +++ b/engines/titanic/core/game_object.h @@ -31,6 +31,7 @@ namespace Titanic { class CVideoSurface; +class CMouseDragStartMsg; class CGameObject : public CNamedItem { public: @@ -74,7 +75,7 @@ protected: int _field50; int _field54; int _field58; - bool _field5C; + bool _visible; CMovieClipList _clipList1; int _field78; CMovieClipList _clipList2; @@ -83,8 +84,7 @@ protected: int _field94; int _field98; int _field9C; - int _fieldA0; - int _fieldA4; + Common::Point _savedPos; CVideoSurface *_surface; CString _resource; int _fieldB8; @@ -94,9 +94,24 @@ protected: */ void loadFrame(int frameNumber); + /** + * Saves the current position the object is located at + */ + void savePosition(); + + /** + * Resets the object back to the previously saved starting position + */ + void resetPosition(); + + /** + * Check for starting to drag the object + */ + bool checkStartDragging(CMouseDragStartMsg *msg); + bool soundFn1(int val); void soundFn2(int val, int val2); - void set5C(bool val); + void setVisible(bool val); bool petFn1(int val); void petFn2(int val); void petFn3(int val); @@ -135,6 +150,11 @@ public: * Change the object's status */ void changeStatus(int newStatus); + + /** + * Set the position of the object + */ + void setPosition(const Common::Point &newPos); }; } // End of namespace Titanic diff --git a/engines/titanic/core/saveable_object.cpp b/engines/titanic/core/saveable_object.cpp index f7c715fd66..022a72b33a 100644 --- a/engines/titanic/core/saveable_object.cpp +++ b/engines/titanic/core/saveable_object.cpp @@ -897,6 +897,7 @@ DEFFN(CSetChevLiftBits) DEFFN(CSetChevPanelBitMsg) DEFFN(CSetChevPanelButtonsMsg) DEFFN(CSetChevRoomBits) +DEFFN(CSetFrameMsg); DEFFN(CSetMusicControlsMsg) DEFFN(CSetVarMsg) DEFFN(CSetVolumeMsg) @@ -1479,6 +1480,7 @@ void CSaveableObject::initClassList() { ADDFN(CSetChevPanelBitMsg, CMessage); ADDFN(CSetChevPanelButtonsMsg, CMessage); ADDFN(CSetChevRoomBits, CMessage); + ADDFN(CSetFrameMsg, CMessage); ADDFN(CSetMusicControlsMsg, CMessage); ADDFN(CSetVarMsg, CMessage); ADDFN(CSetVolumeMsg, CMessage); diff --git a/engines/titanic/core/tree_item.cpp b/engines/titanic/core/tree_item.cpp index 2c985bf34e..081c5806b6 100644 --- a/engines/titanic/core/tree_item.cpp +++ b/engines/titanic/core/tree_item.cpp @@ -284,4 +284,9 @@ CTreeItem *CTreeItem::getDontSaveChild(ClassDef *classDef) const { return dontSave->findChildInstanceOf(classDef); } +CRoomItem *CTreeItem::getRoom() const { + CGameManager *gameManager = getGameManager(); + return gameManager ? gameManager->getRoom() : nullptr; +} + } // End of namespace Titanic diff --git a/engines/titanic/core/tree_item.h b/engines/titanic/core/tree_item.h index a6c09b8126..f5e28f1056 100644 --- a/engines/titanic/core/tree_item.h +++ b/engines/titanic/core/tree_item.h @@ -33,6 +33,7 @@ class CNamedItem; class CPetControl; class CProjectItem; class CScreenManager; +class CRoomItem; class CTreeItem: public CMessageTarget { private: @@ -242,6 +243,10 @@ public: */ CTreeItem *getDontSaveChild(ClassDef *classDef) const; + /** + * Return the current room + */ + CRoomItem *getRoom() const; }; } // End of namespace Titanic diff --git a/engines/titanic/game/cdrom.cpp b/engines/titanic/game/cdrom.cpp index 40e8ed05d8..d4e4eac4d1 100644 --- a/engines/titanic/game/cdrom.cpp +++ b/engines/titanic/game/cdrom.cpp @@ -21,6 +21,8 @@ */ #include "titanic/game/cdrom.h" +#include "titanic/core/room_item.h" +#include "titanic/game/cdrom_tray.h" namespace Titanic { @@ -29,14 +31,50 @@ CCDROM::CCDROM() : CGameObject() { void CCDROM::save(SimpleFile *file, int indent) const { file->writeNumberLine(1, indent); - file->writePoint(_pos1, indent); + file->writePoint(_tempPos, indent); CGameObject::save(file, indent); } void CCDROM::load(SimpleFile *file) { file->readNumber(); - _pos1 = file->readPoint(); + _tempPos = file->readPoint(); CGameObject::load(file); } +bool CCDROM::handleMessage(CMouseDragStartMsg &msg) { + if (checkStartDragging(&msg)) { + _tempPos = msg._mousePos - _bounds; + setPosition(msg._mousePos - _tempPos); + return true; + } else { + return false; + } +} + +bool CCDROM::handleMessage(CMouseDragEndMsg &msg) { + if (msg._dropTarget && msg._dropTarget->getName() == "newComputer") { + CCDROMTray *newTray = dynamic_cast<CCDROMTray *>(getRoom()->findByName("newTray")); + + if (newTray->_state && newTray->_string1 == "None") { + CActMsg actMsg(getName()); + actMsg.execute(newTray); + } + } + + resetPosition(); + return true; +} + +bool CCDROM::handleMessage(CMouseDragMoveMsg &msg) { + setPosition(msg._mousePos - _tempPos); + return true; +} + +bool CCDROM::handleMessage(CActMsg &msg) { + if (msg._action == "Ejected") + setVisible(true); + + return true; +} + } // End of namespace Titanic diff --git a/engines/titanic/game/cdrom.h b/engines/titanic/game/cdrom.h index c1280f6712..61bada0b74 100644 --- a/engines/titanic/game/cdrom.h +++ b/engines/titanic/game/cdrom.h @@ -24,12 +24,23 @@ #define TITANIC_CDROM_H #include "titanic/core/game_object.h" +#include "titanic/messages/messages.h" +#include "titanic/messages/mouse_messages.h" namespace Titanic { -class CCDROM : public CGameObject { +class CCDROM : public CGameObject, + public CMouseDragStartMsgTarget, + public CMouseDragEndMsgTarget, + public CMouseDragMoveMsgTarget, + public CActMsgTarget { private: - Point _pos1; + Point _tempPos; +protected: + virtual bool handleMessage(CMouseDragStartMsg &msg); + virtual bool handleMessage(CMouseDragEndMsg &msg); + virtual bool handleMessage(CMouseDragMoveMsg &msg); + virtual bool handleMessage(CActMsg &msg); public: CLASSDEF CCDROM(); diff --git a/engines/titanic/game/cdrom_tray.cpp b/engines/titanic/game/cdrom_tray.cpp index 32eea0648b..fcb65fd42d 100644 --- a/engines/titanic/game/cdrom_tray.cpp +++ b/engines/titanic/game/cdrom_tray.cpp @@ -24,12 +24,12 @@ namespace Titanic { -CCDROMTray::CCDROMTray() : CGameObject(), _fieldBC(0) { +CCDROMTray::CCDROMTray() : CGameObject(), _state(0) { } void CCDROMTray::save(SimpleFile *file, int indent) const { file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldBC, indent); + file->writeNumberLine(_state, indent); file->writeQuotedLine(_string1, indent); CGameObject::save(file, indent); @@ -37,7 +37,7 @@ void CCDROMTray::save(SimpleFile *file, int indent) const { void CCDROMTray::load(SimpleFile *file) { file->readNumber(); - _fieldBC = file->readNumber(); + _state = file->readNumber(); _string1 = file->readString(); CGameObject::load(file); diff --git a/engines/titanic/game/cdrom_tray.h b/engines/titanic/game/cdrom_tray.h index 85d26c5a1d..b5c4b375fe 100644 --- a/engines/titanic/game/cdrom_tray.h +++ b/engines/titanic/game/cdrom_tray.h @@ -28,8 +28,8 @@ namespace Titanic { class CCDROMTray : public CGameObject { -private: - int _fieldBC; +public: + int _state; CString _string1; public: CLASSDEF diff --git a/engines/titanic/game/television.cpp b/engines/titanic/game/television.cpp index 8149b8d017..ffec1bcdb8 100644 --- a/engines/titanic/game/television.cpp +++ b/engines/titanic/game/television.cpp @@ -90,7 +90,7 @@ bool CTelevision::handleMessage(CLeaveViewMsg &msg) { loadFrame(622); stopMovie(); - set5C(0); + setVisible(0); _isOn = false; if (compareRoomNameTo("CSGState")) { @@ -124,7 +124,7 @@ bool CTelevision::handleMessage(CEnterViewMsg &msg) { petFn1(2); petFn2(2); petFn3(0); - set5C(0); + setVisible(0); _fieldE0 = 1; return true; @@ -175,12 +175,12 @@ bool CTelevision::handleMessage(CActMsg &msg) { if (msg._action == "TurnTVOnOff") { _isOn = !_isOn; if (_isOn) { - set5C(true); + setVisible(true); CStatusChangeMsg changeMsg; changeMsg.execute(this); } else { // TODO: Should 5C be a boolean? - set5C(_isOn); + setVisible(_isOn); stopMovie(); } } @@ -194,7 +194,7 @@ bool CTelevision::handleMessage(CPETActivateMsg &msg) { _isOn = !_isOn; if (_isOn) { - set5C(true); + setVisible(true); fn1(0, 55, 0); _fieldE0 = 1; } else { @@ -202,7 +202,7 @@ bool CTelevision::handleMessage(CPETActivateMsg &msg) { if (soundFn1(_fieldF0)) soundFn2(_fieldF0, 0); - set5C(false); + setVisible(false); } if (compareRoomNameTo("SGTState")) diff --git a/engines/titanic/messages/messages.h b/engines/titanic/messages/messages.h index 77d53f21a6..99df239eda 100644 --- a/engines/titanic/messages/messages.h +++ b/engines/titanic/messages/messages.h @@ -366,6 +366,7 @@ MESSAGE1(CSetChevLiftBits, int, value, 0); MESSAGE2(CSetChevPanelBitMsg, int, value1, 0, int, value2, 0); MESSAGE1(CSetChevPanelButtonsMsg, int, value, 0); MESSAGE1(CSetChevRoomBits, int, value, 0); +MESSAGE1(CSetFrameMsg, int, frameNumber, 0); MESSAGE0(CSetMusicControlsMsg); MESSAGE2(CSetVarMsg, CString, varName, "", int, value, 0); MESSAGE2(CSetVolumeMsg, int, value1, 70, int, value2, 0); diff --git a/engines/titanic/messages/mouse_messages.h b/engines/titanic/messages/mouse_messages.h index 7fe7ef960f..41943818e2 100644 --- a/engines/titanic/messages/mouse_messages.h +++ b/engines/titanic/messages/mouse_messages.h @@ -179,12 +179,12 @@ public: MSGTARGET(CMouseDragEndMsg); class CMouseDragEndMsg : public CMouseDragMsg { public: - CTreeItem *_dragItem; + CTreeItem *_dropTarget; public: CLASSDEF - CMouseDragEndMsg() : CMouseDragMsg(), _dragItem(nullptr) {} + CMouseDragEndMsg() : CMouseDragMsg(), _dropTarget(nullptr) {} CMouseDragEndMsg(const Point &pt, CTreeItem *dragItem = nullptr) : - CMouseDragMsg(pt), _dragItem(dragItem) {} + CMouseDragMsg(pt), _dropTarget(dragItem) {} static bool isSupportedBy(const CTreeItem *item) { return dynamic_cast<const CMouseDragEndMsgTarget *>(item) != nullptr; |