[Scummvm-cvs-logs] SF.net SVN: scummvm: [28693] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Tue Aug 21 22:44:33 CEST 2007


Revision: 28693
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28693&view=rev
Author:   drmccoy
Date:     2007-08-21 13:44:32 -0700 (Tue, 21 Aug 2007)

Log Message:
-----------
Fixed the cutscenes in the CD version of Lost in Time
(There's still something wrong with the second one, the one with the agent, though. Probably has to do with the sound key command 10)

Modified Paths:
--------------
    scummvm/trunk/engines/gob/cdrom.cpp
    scummvm/trunk/engines/gob/cdrom.h
    scummvm/trunk/engines/gob/inter_v2.cpp

Modified: scummvm/trunk/engines/gob/cdrom.cpp
===================================================================
--- scummvm/trunk/engines/gob/cdrom.cpp	2007-08-21 20:12:18 UTC (rev 28692)
+++ scummvm/trunk/engines/gob/cdrom.cpp	2007-08-21 20:44:32 UTC (rev 28693)
@@ -151,41 +151,28 @@
 		}
 }
 
-void CDROM::startTrack(const char *trackname) {
-	byte *curPtr, *matchPtr;
-
+void CDROM::startTrack(const char *trackName) {
 	if (!_LICbuffer)
 		return;
 
-	debugC(1, kDebugMusic, "CDROM::startTrack(%s)", trackname);
+	debugC(1, kDebugMusic, "CDROM::startTrack(%s)", trackName);
 
-	matchPtr = 0;
-	curPtr = _LICbuffer;
-
-	for (int i = 0; i < _numTracks; i++) {
-		if (!scumm_stricmp((char *)curPtr, trackname)) {
-			matchPtr = curPtr;
-			break;
-		}
-		curPtr += 22;
-	}
-
+	byte *matchPtr = getTrackBuffer(trackName);
 	if (!matchPtr) {
-		warning("Track \"%s\" not found", trackname);
+		warning("Track \"%s\" not found", trackName);
 		return;
 	}
 
-	strncpy0(_curTrack, trackname, 15);
+	strncpy0(_curTrack, trackName, 15);
 
 	stopPlaying();
+	_curTrackBuffer = matchPtr;
 
-	while (getTrackPos() != -1);
+	while (getTrackPos() >= 0);
 
-	uint32 start, end;
+	uint32 start = READ_LE_UINT32(matchPtr + 12);
+	uint32 end   = READ_LE_UINT32(matchPtr + 16);
 
-	start = READ_LE_UINT32(matchPtr + 12);
-	end   = READ_LE_UINT32(matchPtr + 16);
-
 	play(start, end);
 
 	_startTime = _vm->_util->getTimeKey();
@@ -205,12 +192,27 @@
 	_cdPlaying = true;
 }
 
-int32 CDROM::getTrackPos() {
-	uint32 curPos = _vm->_util->getTimeKey() - _startTime;
+int32 CDROM::getTrackPos(const char *keyTrack) {
+	byte *keyBuffer = getTrackBuffer(keyTrack);
+	uint32 curPos = (_vm->_util->getTimeKey() - _startTime) * 3 / 40;
 
-	if (_cdPlaying && (_vm->_util->getTimeKey() < _trackStop))
-		return curPos * 3 / 40;
-	else
+	if (_cdPlaying && (_vm->_util->getTimeKey() < _trackStop)) {
+		if (keyBuffer && _curTrackBuffer && (keyBuffer != _curTrackBuffer)) {
+			uint32 kStart = READ_LE_UINT32(keyBuffer + 12);
+			uint32 kEnd = READ_LE_UINT32(keyBuffer + 16);
+			uint32 cStart = READ_LE_UINT32(_curTrackBuffer + 12);
+			uint32 cEnd = READ_LE_UINT32(_curTrackBuffer + 16);
+
+			if ((kStart >= cStart) && (kEnd <= cEnd)) {
+				if ((kStart - cStart) > curPos)
+					return -2;
+				if ((kEnd - cStart) < curPos)
+					return -1;
+			}
+		}
+
+		return curPos;
+	} else
 		return -1;
 }
 
@@ -227,6 +229,7 @@
 void CDROM::stop() {
 	debugC(1, kDebugMusic, "CDROM::stop()");
 
+	_curTrackBuffer = 0;
 	AudioCD.stop();
 	_cdPlaying = false;
 }
@@ -245,4 +248,22 @@
 	// CD secor reading
 }
 
+byte *CDROM::getTrackBuffer(const char *trackName) {
+	if (!_LICbuffer || !trackName)
+		return 0;
+
+	byte *matchPtr = 0;
+	byte *curPtr = _LICbuffer;
+
+	for (int i = 0; i < _numTracks; i++) {
+		if (!scumm_stricmp((char *) curPtr, trackName)) {
+			matchPtr = curPtr;
+			break;
+		}
+		curPtr += 22;
+	}
+
+	return matchPtr;
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/cdrom.h
===================================================================
--- scummvm/trunk/engines/gob/cdrom.h	2007-08-21 20:12:18 UTC (rev 28692)
+++ scummvm/trunk/engines/gob/cdrom.h	2007-08-21 20:44:32 UTC (rev 28693)
@@ -35,11 +35,11 @@
 	void readLIC(const char *fname);
 	void freeLICbuffer();
 
-	void startTrack(const char *s);
+	void startTrack(const char *trackName);
 	void playBgMusic();
 	void playMultMusic();
 	void play(uint32 from, uint32 to);
-	int32 getTrackPos();
+	int32 getTrackPos(const char *keyTrack = 0);
 	const char *getCurTrack();
 	void stopPlaying();
 	void stop();
@@ -49,11 +49,14 @@
 
 protected:
 	byte *_LICbuffer;
+	byte *_curTrackBuffer;
 	char _curTrack[16];
 	uint16 _numTracks;
 	uint32 _trackStop;
 	uint32 _startTime;
 	GobEngine *_vm;
+
+	byte *getTrackBuffer(const char *trackName);
 };
 
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2007-08-21 20:12:18 UTC (rev 28692)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2007-08-21 20:44:32 UTC (rev 28693)
@@ -1105,7 +1105,7 @@
 	varPos = _vm->_parse->parseVarIndex();
 	varName = _vm->_parse->parseVarIndex();
 
-	WRITE_VAR_OFFSET(varPos, _vm->_cdrom->getTrackPos());
+	WRITE_VAR_OFFSET(varPos, _vm->_cdrom->getTrackPos(GET_VARO_STR(varName)));
 	WRITE_VARO_STR(varName, _vm->_cdrom->getCurTrack());
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list