diff options
| -rw-r--r-- | engines/titanic/core/game_object.cpp | 73 | ||||
| -rw-r--r-- | engines/titanic/core/game_object.h | 11 | ||||
| -rw-r--r-- | engines/titanic/core/link_item.cpp | 9 | ||||
| -rw-r--r-- | engines/titanic/core/link_item.h | 5 | ||||
| -rw-r--r-- | engines/titanic/core/tree_item.h | 6 | ||||
| -rw-r--r-- | engines/titanic/core/view_item.cpp | 11 | ||||
| -rw-r--r-- | engines/titanic/core/view_item.h | 6 | ||||
| -rw-r--r-- | engines/titanic/game/computer.cpp | 73 | ||||
| -rw-r--r-- | engines/titanic/game/computer.h | 10 | ||||
| -rw-r--r-- | engines/titanic/support/screen_manager.cpp | 2 | 
10 files changed, 198 insertions, 8 deletions
| diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp index 0570008a09..02a64dcad2 100644 --- a/engines/titanic/core/game_object.cpp +++ b/engines/titanic/core/game_object.cpp @@ -424,4 +424,77 @@ void CGameObject::soundProximity(const CString &name, CProximity &prox) {  	}  } +void CGameObject::gotoView(const CString &viewName, const CString &clipName) { +	CViewItem *newView = parseView(viewName); +	CGameManager *gameManager = getGameManager(); +	CViewItem *oldView = gameManager ? gameManager->getView() : newView; +	if (!oldView || !newView) +		return; + +	CMovieClip *clip = nullptr; +	if (clipName.empty()) { +		CLinkItem *link = oldView->findLink(newView); +		if (link) +			clip = link->getClip(); +	} else { +		clip = oldView->findNode()->findRoom()->findClip(clipName); +	} + +	// Change the view +	gameManager->_gameState.changeView(newView, clip); +} + +CViewItem *CGameObject::parseView(const CString &viewString) { +	int firstIndex = viewString.indexOf('.'); +	int lastIndex = viewString.lastIndexOf('.'); +	CString roomName, nodeName, viewName; + +	if (firstIndex == -1) { +		roomName = viewString; +	} else { +		roomName = viewString.left(firstIndex); + +		if (lastIndex > firstIndex) { +			nodeName = viewString.mid(firstIndex + 1, lastIndex - firstIndex - 1); +			viewName = viewString.mid(lastIndex + 1); +		} else { +			nodeName = viewString.mid(firstIndex + 1); +		} +	} + +	CGameManager *gameManager = getGameManager(); +	if (!gameManager) +		return nullptr; + +	CRoomItem *room = gameManager->getRoom(); +	CProjectItem *project = room->getRoot(); +	 +	// Ensure we have the specified room +	if (project) { +		if (room->getName() != roomName) { +			// Scan for the correct room +			for (room = project->findFirstRoom(); room && room->getName() != roomName; +					room = project->findNextRoom(room)) ; +		}			 +	} +	if (!room) +		return nullptr; + +	// Find the designated node within the room +	CNodeItem *node = static_cast<CNodeItem *>(room->findChildInstanceOf(CNodeItem::_type)); +	while (node && node->getName() != nodeName) +		node = static_cast<CNodeItem *>(room->findNextInstanceOf(CNodeItem::_type, node)); +	if (!node) +		return nullptr; + +	CViewItem *view = static_cast<CViewItem *>(node->findChildInstanceOf(CViewItem::_type)); +	while (view && view->getName() != viewName) +		view = static_cast<CViewItem *>(node->findNextInstanceOf(CViewItem::_type, view)); +	if (!view) +		return nullptr; + +	// Find the view, so return it +	return view; +} +  } // End of namespace Titanic diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h index 72192425f4..2fc047e523 100644 --- a/engines/titanic/core/game_object.h +++ b/engines/titanic/core/game_object.h @@ -112,6 +112,17 @@ protected:  	 */  	void setPetArea(PetArea newArea) const; +	/** +	 * Goto a new view +	 */ +	void gotoView(const CString &viewName, const CString &clipName); + +	/** +	 * Parses a view into it's components of room, node, and view, +	 * and locates the designated view +	 */ +	CViewItem * parseView(const CString &viewString); +  	bool soundFn1(int val);  	void soundFn2(int val, int val2);  	void setVisible(bool val); diff --git a/engines/titanic/core/link_item.cpp b/engines/titanic/core/link_item.cpp index 285838b692..b172b9b4d0 100644 --- a/engines/titanic/core/link_item.cpp +++ b/engines/titanic/core/link_item.cpp @@ -108,6 +108,15 @@ void CLinkItem::load(SimpleFile *file) {  	}  } +bool CLinkItem::connectsTo(CViewItem *destView) const { +	CNodeItem *destNode = destView->findNode(); +	CRoomItem *destRoom = destNode->findRoom(); + +	return _viewNumber == destView->_viewNumber && +		_nodeNumber == destNode->_nodeNumber && +		_roomNumber == destRoom->_roomNumber; +} +  void CLinkItem::setDestination(int roomNumber, int nodeNumber,  		int viewNumber, int v) {  	_roomNumber = roomNumber; diff --git a/engines/titanic/core/link_item.h b/engines/titanic/core/link_item.h index 72829720d7..25de74104b 100644 --- a/engines/titanic/core/link_item.h +++ b/engines/titanic/core/link_item.h @@ -63,6 +63,11 @@ public:  	virtual void load(SimpleFile *file);  	/** +	 * Returns true if the given item connects to another specified view +	 */ +	virtual bool connectsTo(CViewItem *destView) const; + +	/**  	 * Set the destination for the link item  	 */  	virtual void setDestination(int roomNumber, int nodeNumber, diff --git a/engines/titanic/core/tree_item.h b/engines/titanic/core/tree_item.h index d34f963584..4de030f387 100644 --- a/engines/titanic/core/tree_item.h +++ b/engines/titanic/core/tree_item.h @@ -35,6 +35,7 @@ class CPetControl;  class CProjectItem;  class CScreenManager;  class CRoomItem; +class CViewItem;  class CTreeItem: public CMessageTarget {  	friend class CMessage; @@ -126,6 +127,11 @@ public:  	virtual int compareTo(const CString &name, int maxLen) const { return false; }  	/** +	 * Returns true if the given item connects to another specified view +	 */ +	virtual bool connectsTo(CViewItem *destView) const { return false; } + +	/**  	 * Allows the item to draw itself  	 */  	virtual void draw(CScreenManager *screenManager) {} diff --git a/engines/titanic/core/view_item.cpp b/engines/titanic/core/view_item.cpp index 3f6d5d5cff..b829ae5a70 100644 --- a/engines/titanic/core/view_item.cpp +++ b/engines/titanic/core/view_item.cpp @@ -168,6 +168,17 @@ void CViewItem::enterView(CViewItem *newView) {  	}  } +CLinkItem *CViewItem::findLink(CViewItem *newView) { +	for (CTreeItem *treeItem = getFirstChild(); treeItem; +			treeItem = scan(treeItem)) { +		CLinkItem *link = static_cast<CLinkItem *>(treeItem); +		if (link && link->connectsTo(newView)) +			return link; +	} + +	return nullptr; +} +  bool CViewItem::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {  	if (msg->_buttons & MB_LEFT) {  		if (!handleMouseMsg(msg, true)) { diff --git a/engines/titanic/core/view_item.h b/engines/titanic/core/view_item.h index 5abcf1d012..67b2113142 100644 --- a/engines/titanic/core/view_item.h +++ b/engines/titanic/core/view_item.h @@ -23,6 +23,7 @@  #ifndef TITANIC_VIEW_ITEM_H  #define TITANIC_VIEW_ITEM_H +#include "titanic/core/link_item.h"  #include "titanic/core/named_item.h"  #include "titanic/core/resource_key.h"  #include "titanic/messages/mouse_messages.h" @@ -90,6 +91,11 @@ public:  	 * Called when a new view is being entered  	 */  	void enterView(CViewItem *newView); + +	/** +	 * Finds a link which connects to another designated view +	 */ +	CLinkItem *findLink(CViewItem *newView);  };  } // End of namespace Titanic diff --git a/engines/titanic/game/computer.cpp b/engines/titanic/game/computer.cpp index a28292184e..2b0f7767fb 100644 --- a/engines/titanic/game/computer.cpp +++ b/engines/titanic/game/computer.cpp @@ -24,18 +24,83 @@  namespace Titanic { +BEGIN_MESSAGE_MAP(CComputer, CBackground) +	ON_MESSAGE(ActMsg) +	ON_MESSAGE(MouseButtonDownMsg) +	ON_MESSAGE(MovieEndMsg) +END_MESSAGE_MAP() +  void CComputer::save(SimpleFile *file, int indent) const {  	file->writeNumberLine(1, indent); -	file->writeQuotedLine(_string3, indent); -	file->writeNumberLine(_fieldEC, indent); +	file->writeQuotedLine(_currentCD, indent); +	file->writeNumberLine(_state, indent);  	CBackground::save(file, indent);  }  void CComputer::load(SimpleFile *file) {  	file->readNumber(); -	_string3 = file->readString(); -	_fieldEC = file->readNumber(); +	_currentCD = file->readString(); +	_state = file->readNumber();  	CBackground::load(file);  } +bool CComputer::ActMsg(CActMsg *msg) { +	if (_state) { +		soundProximity("a#35.wav", 100, 0, 0); +		fn1(32, 42, 0); + +		if (msg->_action == "CD1") +			fn1(43, 49, 0); +		else if (msg->_action == "CD2") +			fn1(50, 79, 0); +		else if (msg->_action == "STCD") +			fn1(80, 90, 4); + +		_currentCD = msg->_action; +		_state = 0; +	} + +	return true; +} + +bool CComputer::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { +	if (_currentCD == "None") { +		if (_state) { +			soundProximity("a#35.wav", 100, 0, 0); +			fn1(11, 21, 0); +			_state = 0; +		} else { +			soundProximity("a#34.wav", 100, 0, 0); +			fn1(0, 10, 0); +			_state = 1; +		} +	} else { +		if (_state) { +			loadFrame(11); +			CActMsg actMsg("EjectCD"); +			actMsg.execute(_currentCD); +			_currentCD = "None"; +		} else { +			soundProximity("a#34.wav", 100, 0, 0); +			fn1(21, 31, 0); +			_state = 1; +		} +	} + +	return true; +} + +bool CComputer::MovieEndMsg(CMovieEndMsg *msg) { +	if (msg->_value2 == 90) { +		soundProximity("a#32.wav", 100, 0, 0); +		soundProximity("a#33.wav", 100, 0, 0); +		soundProximity("a#31.wav", 100, 0, 0); +		soundProximity("a#0.wav", 100, 0, 0); + +		gotoView("Home.Node 4.E", "_TRACK,3,e-cu,4,E"); +	} + +	return true; +} +  } // End of namespace Titanic diff --git a/engines/titanic/game/computer.h b/engines/titanic/game/computer.h index 793fecc491..3db0ee1979 100644 --- a/engines/titanic/game/computer.h +++ b/engines/titanic/game/computer.h @@ -28,12 +28,16 @@  namespace Titanic {  class CComputer : public CBackground { +	DECLARE_MESSAGE_MAP +	bool ActMsg(CActMsg *msg); +	bool MouseButtonDownMsg(CMouseButtonDownMsg *msg); +	bool MovieEndMsg(CMovieEndMsg *msg);  public: -	CString _string3; -	int _fieldEC; +	CString _currentCD; +	int _state;  public:  	CLASSDEF -	CComputer() : CBackground(), _string3("None"), _fieldEC(0) {} +	CComputer() : CBackground(), _currentCD("None"), _state(0) {}  	/**  	 * Save the data for the class to file diff --git a/engines/titanic/support/screen_manager.cpp b/engines/titanic/support/screen_manager.cpp index 05dfa66854..d2f2468c89 100644 --- a/engines/titanic/support/screen_manager.cpp +++ b/engines/titanic/support/screen_manager.cpp @@ -110,7 +110,7 @@ void OSScreenManager::setMode(int width, int height, int bpp, uint numBackSurfac  }  void OSScreenManager::drawCursors() { -	warning("OSScreenManager::drawCursors"); +	// Nothing needed here, since ScummVM handles cursor drawing  }  DirectDrawSurface *OSScreenManager::getDDSurface(SurfaceNum surfaceNum) { | 
