[Scummvm-cvs-logs] scummvm master -> 7e3d91cd46426e8091032010f36f86ee467a899c

dreammaster dreammaster at scummvm.org
Sun Aug 14 20:57:31 CEST 2016


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
7e3d91cd46 TITANIC: Implemented CTitania class


Commit: 7e3d91cd46426e8091032010f36f86ee467a899c
    https://github.com/scummvm/scummvm/commit/7e3d91cd46426e8091032010f36f86ee467a899c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2016-08-14T14:57:23-04:00

Commit Message:
TITANIC: Implemented CTitania class

Changed paths:
    engines/titanic/core/game_object.cpp
    engines/titanic/core/game_object.h
    engines/titanic/game_manager.cpp
    engines/titanic/npcs/titania.cpp
    engines/titanic/npcs/titania.h
    engines/titanic/support/movie.cpp
    engines/titanic/support/movie.h



diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp
index 9a524e5..12d4c56 100644
--- a/engines/titanic/core/game_object.cpp
+++ b/engines/titanic/core/game_object.cpp
@@ -668,6 +668,20 @@ void CGameObject::playRandomClip(const char *const *names, uint flags) {
 	playClip(name, flags);
 }
 
+void CGameObject::playCutscene(uint startFrame, uint endFrame) {
+	if (!_surface) {
+		if (!_resource.empty())
+			loadResource(_resource);
+		_resource.clear();
+	}
+
+	if (_surface && _surface->loadIfReady() && _surface->_movie) {
+		disableMouse();
+		_surface->_movie->playCutscene(_bounds, startFrame, endFrame);
+		enableMouse();
+	}
+}
+
 void CGameObject::savePosition() {
 	_savedPos = _bounds;
 }
diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h
index f853a63..cdb5f69 100644
--- a/engines/titanic/core/game_object.h
+++ b/engines/titanic/core/game_object.h
@@ -350,6 +350,11 @@ protected:
 	void playClip(uint startFrame, uint endFrame);
 
 	/**
+	 * Play a cutscene
+	 */
+	void playCutscene(uint startFrame, uint endFrame);
+
+	/**
 	 * Play a clip randomly from a passed list of names
 	 */
 	void playRandomClip(const char *const *names, uint flags);
diff --git a/engines/titanic/game_manager.cpp b/engines/titanic/game_manager.cpp
index 9bc9e4d..73ec5de 100644
--- a/engines/titanic/game_manager.cpp
+++ b/engines/titanic/game_manager.cpp
@@ -153,7 +153,7 @@ void CGameManager::playClip(CMovieClip *clip, CRoomItem *oldRoom, CRoomItem *new
 
 		lockInputHandler();
 		CScreenManager::_screenManagerPtr->_mouseCursor->hide();
-		_movie->playClip(tempRect, clip->_startFrame, clip->_endFrame);
+		_movie->playCutscene(tempRect, clip->_startFrame, clip->_endFrame);
 		CScreenManager::_screenManagerPtr->_mouseCursor->show();
 		unlockInputHandler();
 	}
diff --git a/engines/titanic/npcs/titania.cpp b/engines/titanic/npcs/titania.cpp
index 34c21d0..000595f 100644
--- a/engines/titanic/npcs/titania.cpp
+++ b/engines/titanic/npcs/titania.cpp
@@ -24,54 +24,202 @@
 
 namespace Titanic {
 
+BEGIN_MESSAGE_MAP(CTitania, CCharacter)
+	ON_MESSAGE(AddHeadPieceMsg)
+	ON_MESSAGE(TakeHeadPieceMsg)
+	ON_MESSAGE(ActMsg)
+	ON_MESSAGE(EnterViewMsg)
+	ON_MESSAGE(TimerMsg)
+END_MESSAGE_MAP()
+
 CTitania::CTitania() : CCharacter() {
-	_fieldD4 = 0;
-	_fieldD8 = 0;
-	_fieldE0 = 0;
-	_fieldE4 = 0;
-	_fieldE8 = 0;
-	_fieldEC = 0;
-	_fieldF0 = 0;
-	_fieldF4 = 0;
-	_fieldF8 = 0;
-	_fieldFC = 0;
-	_field100 = 1;
+	_speechCentre = false;
+	_olfactoryCentre = false;
+	_centralCore = false;
+	_visionCentre = false;
+	_eye1 = false;
+	_eye2 = false;
+	_ear1 = false;
+	_ear2 = false;
+	_nose = false;
+	_mouth = false;
+	_showIntro = true;
 }
 
 void CTitania::save(SimpleFile *file, int indent) {
 	file->writeNumberLine(1, indent);
-	file->writeNumberLine(_fieldD4, indent);
-	file->writeNumberLine(_fieldD8, indent);
-	file->writeNumberLine(_fieldDC, indent);
-	file->writeNumberLine(_fieldE0, indent);
-	file->writeNumberLine(_fieldE4, indent);
-	file->writeNumberLine(_fieldE8, indent);
-	file->writeNumberLine(_fieldEC, indent);
-	file->writeNumberLine(_fieldF0, indent);
-	file->writeNumberLine(_fieldF4, indent);
-	file->writeNumberLine(_fieldF8, indent);
-	file->writeNumberLine(_fieldFC, indent);
-	file->writeNumberLine(_field100, indent);
+	file->writeNumberLine(_speechCentre, indent);
+	file->writeNumberLine(_olfactoryCentre, indent);
+	file->writeNumberLine(_auditoryCentre, indent);
+	file->writeNumberLine(_centralCore, indent);
+	file->writeNumberLine(_visionCentre, indent);
+	file->writeNumberLine(_eye1, indent);
+	file->writeNumberLine(_eye2, indent);
+	file->writeNumberLine(_ear1, indent);
+	file->writeNumberLine(_ear2, indent);
+	file->writeNumberLine(_nose, indent);
+	file->writeNumberLine(_mouth, indent);
+	file->writeNumberLine(_showIntro, indent);
 
 	CCharacter::save(file, indent);
 }
 
 void CTitania::load(SimpleFile *file) {
 	file->readNumber();
-	_fieldD4 = file->readNumber();
-	_fieldD8 = file->readNumber();
-	_fieldDC = file->readNumber();
-	_fieldE0 = file->readNumber();
-	_fieldE4 = file->readNumber();
-	_fieldE8 = file->readNumber();
-	_fieldEC = file->readNumber();
-	_fieldF0 = file->readNumber();
-	_fieldF4 = file->readNumber();
-	_fieldF8 = file->readNumber();
-	_fieldFC = file->readNumber();
-	_field100 = file->readNumber();
+	_speechCentre = file->readNumber();
+	_olfactoryCentre = file->readNumber();
+	_auditoryCentre = file->readNumber();
+	_centralCore = file->readNumber();
+	_visionCentre = file->readNumber();
+	_eye1 = file->readNumber();
+	_eye2 = file->readNumber();
+	_ear1 = file->readNumber();
+	_ear2 = file->readNumber();
+	_nose = file->readNumber();
+	_mouth = file->readNumber();
+	_showIntro = file->readNumber();
 
 	CCharacter::load(file);
 }
 
+bool CTitania::AddHeadPieceMsg(CAddHeadPieceMsg *msg) {
+	if (msg->_value == "VisionCentre") {
+		_visionCentre = true;
+	} else if (msg->_value == "AuditoryCentre") {
+		_auditoryCentre = true;
+	} else if (msg->_value == "OlfactoryCentre") {
+		_olfactoryCentre = true;
+	} else if (msg->_value == "SpeechCentre") {
+		_speechCentre = true;
+	} else if (msg->_value == "CentralCore") {
+		_centralCore = true;
+	} else if (msg->_value == "Eye1") {
+		_eye1 = true;
+	} else if (msg->_value == "Eye2") {
+		_eye2 = true;
+	} else if (msg->_value == "Ear1") {
+		_ear1 = true;
+	} else if (msg->_value == "Ear2") {
+		_ear2 = true;
+	} else if (msg->_value == "Mouth") {
+		_mouth = true;
+	} else if (msg->_value == "Nose") {
+		_nose = true;
+	}
+
+	CActMsg actMsg("CheckHead");
+	actMsg.execute(this);
+	return true;
+}
+
+bool CTitania::TakeHeadPieceMsg(CTakeHeadPieceMsg *msg) {
+	if (msg->_value == "VisionCentre") {
+		_visionCentre = false;
+	} else if (msg->_value == "AuditoryCentre") {
+		_auditoryCentre = false;
+	} else if (msg->_value == "OlfactoryCentre") {
+		_olfactoryCentre = false;
+	} else if (msg->_value == "SpeechCentre") {
+		_speechCentre = false;
+	} else if (msg->_value == "CentralCore") {
+		_centralCore = false;
+	} else if (msg->_value == "Eye1") {
+		_eye1 = false;
+	} else if (msg->_value == "Eye2") {
+		_eye2 = false;
+	} else if (msg->_value == "Ear1") {
+		_ear1 = false;
+	} else if (msg->_value == "Ear2") {
+		_ear2 = false;
+	} else if (msg->_value == "Mouth") {
+		_mouth = false;
+	} else if (msg->_value == "Nose") {
+		_nose = false;
+	}
+
+	CActMsg actMsg("CheckHead");
+	actMsg.execute(this);
+	return true;
+}
+
+bool CTitania::ActMsg(CActMsg *msg) {
+	if (msg->_action == "SleepTitania") {
+		setVisible(true);
+		playCutscene(52, 104);
+		playSound("z#47.wav", 100);
+		changeView("Titania.Node 7.S", "");
+
+		petShow();
+		enableMouse();
+		CSetFrameMsg frameMsg;
+		frameMsg.execute("Bomb");
+
+	} else if (msg->_action == "CheckHead") {
+		CSenseWorkingMsg workingMsg1("Not Working");
+		CSenseWorkingMsg workingMsg2("Not Working");
+		CSenseWorkingMsg workingMsg3("Not Working");
+		CSenseWorkingMsg workingMsg4("Not Working");
+		
+		if (_eye1 && _eye2) {
+			workingMsg1._value = _visionCentre ? "Working" : "Random";
+		}
+		if (_ear1 && _ear2) {
+			workingMsg2._value = _auditoryCentre ? "Working" : "Random";
+		}
+		if (_nose) {
+			workingMsg4._value = _olfactoryCentre ? "Working" : "Random";
+		}
+		if (_mouth) {
+			workingMsg3._value = _speechCentre ? "Working" : "Random";
+		}
+
+		if (_centralCore && _eye1 && _eye2 && _ear1 && _ear2 && _nose && _mouth
+				&& _speechCentre && _olfactoryCentre && _auditoryCentre) {
+			playSound("z#47.wav");
+
+			CActMsg actMsg("Woken");
+			actMsg.execute("MouthSlot");
+			actMsg.execute("VisionCentreSlot");
+			setPassengerClass(4);
+
+			addTimer(1000);
+		} else {
+			workingMsg1.execute("Eye1Slot");
+			workingMsg1.execute("Eye2Slot");
+			workingMsg2.execute("Ear1Slot");
+			workingMsg2.execute("Ear2Slot");
+			workingMsg3.execute("MouthSlot");
+			workingMsg4.execute("NoseSlot");
+		}
+	}
+
+	return true;
+}
+
+bool CTitania::EnterViewMsg(CEnterViewMsg *msg) {
+	if (_showIntro) {
+		_showIntro = false;
+		disableMouse();
+		petHide();
+		
+		CSetFrameMsg frameMsg;
+		frameMsg._frameNumber = 25;
+		frameMsg.execute("Bomb");	
+		playCutscene(0, 52);
+
+		setVisible(false);
+		CActMsg actMsg("TitaniaSpeech");
+		actMsg.execute("TitaniaSpeech");
+	}
+
+	return true;
+}
+
+bool CTitania::TimerMsg(CTimerMsg *msg) {
+	changeView("Titania.Node 18.N", "");
+	startTalking("PerchedParrot", 80022);
+
+	return true;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/npcs/titania.h b/engines/titanic/npcs/titania.h
index 4edd626..61f8c86 100644
--- a/engines/titanic/npcs/titania.h
+++ b/engines/titanic/npcs/titania.h
@@ -28,19 +28,25 @@
 namespace Titanic {
 
 class CTitania : public CCharacter {
+	DECLARE_MESSAGE_MAP;
+	bool AddHeadPieceMsg(CAddHeadPieceMsg *msg);
+	bool TakeHeadPieceMsg(CTakeHeadPieceMsg *msg);
+	bool ActMsg(CActMsg *msg);
+	bool EnterViewMsg(CEnterViewMsg *msg);
+	bool TimerMsg(CTimerMsg *msg);
 private:
-	int _fieldD4;
-	int _fieldD8;
-	int _fieldDC;
-	int _fieldE0;
-	int _fieldE4;
-	int _fieldE8;
-	int _fieldEC;
-	int _fieldF0;
-	int _fieldF4;
-	int _fieldF8;
-	int _fieldFC;
-	int _field100;
+	bool _speechCentre;
+	bool _olfactoryCentre;
+	bool _auditoryCentre;
+	bool _centralCore;
+	bool _visionCentre;
+	bool _eye1;
+	bool _eye2;
+	bool _ear1;
+	bool _ear2;
+	bool _nose;
+	bool _mouth;
+	bool _showIntro;
 public:
 	CLASSDEF;
 	CTitania();
diff --git a/engines/titanic/support/movie.cpp b/engines/titanic/support/movie.cpp
index 3bb9fb8..50a55c8 100644
--- a/engines/titanic/support/movie.cpp
+++ b/engines/titanic/support/movie.cpp
@@ -122,20 +122,20 @@ void OSMovie::play(uint startFrame, uint endFrame, uint initialFrame, uint flags
 		movieStarted();
 }
 
-void OSMovie::playClip(const Point &drawPos, uint startFrame, uint endFrame) {
+void OSMovie::playCutscene(const Rect &drawRect, uint startFrame, uint endFrame) {
 	if (!_movieSurface)
 		_movieSurface = CScreenManager::_screenManagerPtr->createSurface(600, 340);
 	
 	bool widthLess = _videoSurface->getWidth() < 600;
 	bool heightLess = _videoSurface->getHeight() < 340;
-	Rect r(drawPos.x, drawPos.y,
-		drawPos.x + (widthLess ? CLIP_WIDTH_REDUCED : CLIP_WIDTH),
-		drawPos.y + (heightLess ? CLIP_HEIGHT_REDUCED : CLIP_HEIGHT)
+	Rect r(drawRect.left, drawRect.top,
+		drawRect.left + (widthLess ? CLIP_WIDTH_REDUCED : CLIP_WIDTH),
+		drawRect.top + (heightLess ? CLIP_HEIGHT_REDUCED : CLIP_HEIGHT)
 	);
 
 	uint timePerFrame = (uint)(1000.0 / _aviSurface._frameRate);
 
-	for (; endFrame >= startFrame; ++startFrame) {
+	for (; startFrame < endFrame; ++startFrame) {
 		// Set the frame
 		_aviSurface.setFrame(startFrame);
 
diff --git a/engines/titanic/support/movie.h b/engines/titanic/support/movie.h
index 2d1c264..8c89f9e 100644
--- a/engines/titanic/support/movie.h
+++ b/engines/titanic/support/movie.h
@@ -84,9 +84,10 @@ public:
 	virtual void play(uint startFrame, uint endFrame, uint initialFrame, uint flags, CGameObject *obj) = 0;
 	
 	/**
-	 * Plays a sub-section of a movie
+	 * Plays a sub-section of a movie, and doesn't return until either
+	 * the playback ends or a key has been pressed
 	 */
-	virtual void playClip(const Point &drawPos, uint startFrame, uint endFrame) = 0;
+	virtual void playCutscene(const Rect &drawRect, uint startFrame, uint endFrame) = 0;
 	
 	/**
 	 * Stops the movie
@@ -182,9 +183,10 @@ public:
 	virtual void play(uint startFrame, uint endFrame, uint initialFrame, uint flags, CGameObject *obj);
 	
 	/**
-	 * Plays a sub-section of a movie
+	 * Plays a sub-section of a movie, and doesn't return until either
+	 * the playback ends or a key has been pressed
 	 */
-	virtual void playClip(const Point &drawPos, uint startFrame, uint endFrame);
+	virtual void playCutscene(const Rect &drawRect, uint startFrame, uint endFrame);
 
 	/**
 	 * Stops the movie






More information about the Scummvm-git-logs mailing list