[Scummvm-git-logs] scummvm master -> a1ed269f1bf1d5ffeff1733e57b7ce842a9d0f2a

ysj1173886760 42030331+ysj1173886760 at users.noreply.github.com
Mon Jul 12 06:24:44 UTC 2021


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

Summary:
e4105dc091 DIRECTOR: clear the widget pointers in castmember when we are switching the movie.
bd78996349 DIRECTOR: amend pushing character constants
8d5f8cef1c DIRECTOR: passing events to both widget and director.
25c7822ec3 DIRECTOR: enhance pathMakeRelative to deal with directories at any level.
090302e636 DIRECTOR: add comments for pathMakeRelative
f719167515 DIRECTOR: add ignoreCast option for findResourceID
fb6bf94ddb DIRECTOR: implement fplay of fplayxobj
a1ed269f1b DIRECTOR: support continuous argument for fplay


Commit: e4105dc09148cfac971745e4ca67a17d9ce45dd9
    https://github.com/scummvm/scummvm/commit/e4105dc09148cfac971745e4ca67a17d9ce45dd9
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-12T14:15:24+08:00

Commit Message:
DIRECTOR: clear the widget pointers in castmember when we are switching the movie.

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/window.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 0b7e93649c..df39975099 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -125,6 +125,12 @@ CastMember *Cast::getCastMember(int castId) {
 	return result;
 }
 
+void Cast::releaseCastMemberWidget() {
+	if (_loadedCast)
+		for (Common::HashMap<int, CastMember *>::iterator it = _loadedCast->begin(); it != _loadedCast->end(); ++it)
+			it->_value->releaseWidget();
+}
+
 CastMember *Cast::getCastMemberByName(const Common::String &name) {
 	CastMember *result = nullptr;
 
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 543121e8a2..4c123bb432 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -96,6 +96,10 @@ public:
 	const Stxt *getStxt(int castId);
 	Common::String getVideoPath(int castId);
 
+	// release all castmember's widget, should be called when we are changing movie.
+	// because widget is handled by channel, thus we should clear all of those run-time info when we are switching the movie. (because we will create new widgets for cast)
+	void releaseCastMemberWidget();
+
 	void dumpScript(const char *script, ScriptType type, uint16 id);
 	PaletteV4 loadPalette(Common::SeekableReadStreamEndian &stream);
 
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index 286a53a6f2..fd2c704ebf 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -482,6 +482,8 @@ bool Window::step() {
 		g_lingo->resetLingo();
 		if (sharedCast && sharedCast->_castArchive
 				&& sharedCast->_castArchive->getPathName().equalsIgnoreCase(_currentPath + _vm->_sharedCastFile)) {
+			// if we are not deleting shared cast, then we need to clear those previous widget pointer
+			sharedCast->releaseCastMemberWidget();
 			_currentMovie->_sharedCast = sharedCast;
 		} else {
 			delete sharedCast;


Commit: bd789963493b216930052d41cad7c3c1ba9e5ca5
    https://github.com/scummvm/scummvm/commit/bd789963493b216930052d41cad7c3c1ba9e5ca5
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-12T14:15:24+08:00

Commit Message:
DIRECTOR: amend pushing character constants

Changed paths:
    engines/director/lingo/lingo-builtins.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 1f3665815b..3d1dcaa60a 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2363,7 +2363,7 @@ void LB::b_empty(int nargs) {
 }
 
 void LB::b_enter(int nargs) {
-	g_lingo->push(Datum(Common::String("\n")));
+	g_lingo->push(Datum(Common::String("\03")));
 }
 
 void LB::b_false(int nargs) {
@@ -2375,7 +2375,7 @@ void LB::b_quote(int nargs) {
 }
 
 void LB::b_returnconst(int nargs) {
-	g_lingo->push(Datum(Common::String("\n")));
+	g_lingo->push(Datum(Common::String("\r")));
 }
 
 void LB::b_tab(int nargs) {


Commit: 8d5f8cef1c482dd630b66d145cbb4a99583b50a1
    https://github.com/scummvm/scummvm/commit/8d5f8cef1c482dd630b66d145cbb4a99583b50a1
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-12T14:15:24+08:00

Commit Message:
DIRECTOR: passing events to both widget and director.

Changed paths:
    engines/director/events.cpp


diff --git a/engines/director/events.cpp b/engines/director/events.cpp
index 3843cb36c8..770dda6991 100644
--- a/engines/director/events.cpp
+++ b/engines/director/events.cpp
@@ -86,13 +86,12 @@ void DirectorEngine::processEvents() {
 }
 
 bool Window::processEvent(Common::Event &event) {
-	if (MacWindow::processEvent(event))
-		return true;
+	bool flag = MacWindow::processEvent(event);
 
 	if (_currentMovie && _currentMovie->processEvent(event))
-		return true;
+		flag = true;
 
-	return false;
+	return flag;
 }
 
 bool Movie::processEvent(Common::Event &event) {


Commit: 25c7822ec30c4115b9a8ad7c17c67285d3b0f4c3
    https://github.com/scummvm/scummvm/commit/25c7822ec30c4115b9a8ad7c17c67285d3b0f4c3
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-12T14:15:25+08:00

Commit Message:
DIRECTOR: enhance pathMakeRelative to deal with directories at any level.

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/util.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 3d1dcaa60a..fb151a2e4d 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1051,25 +1051,13 @@ void LB::b_getNthFileNameInFolder(int nargs) {
 
 	int fileNum = g_lingo->pop().asInt() - 1;
 	Common::String path = pathMakeRelative(g_lingo->pop().asString(), true, false, true);
-	Common::StringTokenizer directory_list(path, "/");
+	// for directory, we either return the correct path, which we can access recursively.
+	// or we get a wrong path, which will lead us to a non-exist file node
 
+	Common::StringTokenizer directory_list(path, "/");
 	Common::FSNode d = Common::FSNode(*g_director->getGameDataDir());
-	if (d.getChild(directory_list.nextToken()).exists()) {
-		// then this part is for the "relative to current directory"
-		// we find the child directory recursively
-		directory_list.reset();
-		while (!directory_list.empty() && d.exists())
-			d = d.getChild(directory_list.nextToken());
-	} else {
-		// we first match the path with game data dir
-		while (!directory_list.empty())
-			if (directory_list.nextToken().equalsIgnoreCase(d.getName()))
-				break;
-		// then we go deep to the end of path
-		// skip the current directory which is the game data directory
-		directory_list.nextToken();
-		while (!directory_list.empty() && d.exists())
-			d = d.getChild(directory_list.nextToken());
+	while (d.exists() && !directory_list.empty()) {
+		d = d.getChild(directory_list.nextToken());
 	}
 
 	Datum r;
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index 2782a8fbab..b7affa67f8 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -23,6 +23,7 @@
 #include "common/file.h"
 #include "common/keyboard.h"
 #include "common/memstream.h"
+#include "common/tokenizer.h"
 #include "common/zlib.h"
 
 #include "graphics/macgui/macwindowmanager.h"
@@ -327,12 +328,26 @@ Common::String getPath(Common::String path, Common::String cwd) {
 
 bool testPath(Common::String &path, bool directory) {
 	if (directory) {
-		// TOOD: This directory-searching branch only works for one level from the
-		// current directory, but it fixes current game loading issues.
-		if (path.contains('/'))
+		Common::FSNode d = Common::FSNode(*g_director->getGameDataDir());
+
+		// check for the game data dir
+		if (!path.contains("/") && path.equalsIgnoreCase(d.getName())) {
+			path = "";
+			return true;
+		}
+
+		Common::StringTokenizer directory_list(path, "/");
+
+		if (d.getChild(directory_list.nextToken()).exists()) {
+			// then this part is for the "relative to current directory"
+			// we find the child directory recursively
+			directory_list.reset();
+			while (!directory_list.empty() && d.exists())
+				d = d.getChild(directory_list.nextToken());
+		} else {
 			return false;
+		}
 
-		Common::FSNode d = Common::FSNode(*g_director->getGameDataDir()).getChild(path);
 		return d.exists();
 	}
 
@@ -348,9 +363,6 @@ bool testPath(Common::String &path, bool directory) {
 Common::String pathMakeRelative(Common::String path, bool recursive, bool addexts, bool directory) {
 	Common::String initialPath(path);
 
-	if (testPath(initialPath, directory))
-		return initialPath;
-
 	if (recursive) // first level
 		initialPath = convertPath(initialPath);
 


Commit: 090302e6363818d5c535df46a524693340ff0fe2
    https://github.com/scummvm/scummvm/commit/090302e6363818d5c535df46a524693340ff0fe2
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-12T14:15:25+08:00

Commit Message:
DIRECTOR: add comments for pathMakeRelative

Changed paths:
    engines/director/util.cpp


diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index b7affa67f8..e89a65e789 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -360,6 +360,9 @@ bool testPath(Common::String &path, bool directory) {
 	return false;
 }
 
+// if we are finding the file path, then this func will return exactly the executable file path
+// if we are finding the directory path, then we will get the path relative to the game data dir.
+// e.g. if we have game data dir as SSwarlock, then "A:SSwarlock" -> "", "A:SSwarlock:Nav" -> "Nav"
 Common::String pathMakeRelative(Common::String path, bool recursive, bool addexts, bool directory) {
 	Common::String initialPath(path);
 


Commit: f7191675157bce647e021246ffb59a9e1e478c5c
    https://github.com/scummvm/scummvm/commit/f7191675157bce647e021246ffb59a9e1e478c5c
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-12T14:15:25+08:00

Commit Message:
DIRECTOR: add ignoreCast option for findResourceID

Changed paths:
    engines/director/archive.cpp
    engines/director/archive.h


diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 7c028bd21e..9a9fc9809e 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -146,14 +146,14 @@ uint32 Archive::getOffset(uint32 tag, uint16 id) const {
 	return resMap[id].offset;
 }
 
-uint16 Archive::findResourceID(uint32 tag, const Common::String &resName) const {
+uint16 Archive::findResourceID(uint32 tag, const Common::String &resName, bool ignoreCase) const {
 	if (!_types.contains(tag) || resName.empty())
 		return 0xFFFF;
 
 	const ResourceMap &resMap = _types[tag];
 
 	for (ResourceMap::const_iterator it = resMap.begin(); it != resMap.end(); it++)
-		if (it->_value.name.matchString(resName))
+		if (it->_value.name.matchString(resName, ignoreCase))
 			return it->_key;
 
 	return 0xFFFF;
diff --git a/engines/director/archive.h b/engines/director/archive.h
index bfa001f8c1..5f88f2e782 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -68,7 +68,7 @@ public:
 	virtual Common::SeekableReadStreamEndian *getFirstResource(uint32 tag);
 	virtual Resource getResourceDetail(uint32 tag, uint16 id);
 	uint32 getOffset(uint32 tag, uint16 id) const;
-	uint16 findResourceID(uint32 tag, const Common::String &resName) const;
+	uint16 findResourceID(uint32 tag, const Common::String &resName, bool ignoreCase = false) const;
 	Common::String getName(uint32 tag, uint16 id) const;
 
 	Common::Array<uint32> getResourceTypeList() const;


Commit: fb6bf94ddb7c2340516941360ef166bca58ceb99
    https://github.com/scummvm/scummvm/commit/fb6bf94ddb7c2340516941360ef166bca58ceb99
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-12T14:15:25+08:00

Commit Message:
DIRECTOR: implement fplay of fplayxobj

Changed paths:
    engines/director/lingo/xlibs/fplayxobj.cpp


diff --git a/engines/director/lingo/xlibs/fplayxobj.cpp b/engines/director/lingo/xlibs/fplayxobj.cpp
index a7a2c2a725..1a26a47a1a 100644
--- a/engines/director/lingo/xlibs/fplayxobj.cpp
+++ b/engines/director/lingo/xlibs/fplayxobj.cpp
@@ -20,16 +20,22 @@
  *
  */
 
- /*************************************
+/*************************************
   *
   * USED IN:
   * Spaceship Warlock Mac
   *
   *************************************/
 
+#include "director/director.h"
+#include "director/archive.h"
+#include "director/sound.h"
+#include "director/util.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/xlibs/fplayxobj.h"
 
+#include "audio/audiostream.h"
+
 namespace Director {
 
 static BuiltinProto builtins[] = {
@@ -53,8 +59,57 @@ void FPlayXObj::initialize(int type) {
 }
 
 void FPlayXObj::b_fplay(int nargs) {
-	g_lingo->printSTUBWithArglist("b_fplay", nargs);
-	g_lingo->dropStack(nargs);
+	if (nargs == 0) {
+		warning("FPlayXObj::b_fplay requires at least one argument");
+		return;
+	}
+
+	if (nargs > 1) {
+		g_lingo->dropStack(nargs - 1);
+		warning("FPlayXObj::b_fplay unhandled %d arguments", nargs - 1);
+	}
+
+	Datum d = g_lingo->pop();
+	DirectorSound *sound = g_director->getSoundManager();
+	Common::String sndName = d.asString();
+
+	if (sndName.equalsIgnoreCase("stop")) {
+		sound->stopSound(1);
+		return;
+	}
+
+	uint32 tag = MKTAG('s', 'n', 'd', ' ');
+	uint id;
+	Archive *archive = nullptr;
+
+	// iterate opened ResFiles
+	for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); ++it) {
+		id = it->_value->findResourceID(tag, sndName, true);
+		if (id != 0xFFFF) {
+			archive = it->_value;
+			break;
+		}
+	}
+
+	if (id == 0xFFFF) {
+		warning("FPlayXObj::b_fplay can not find sound %s", sndName.c_str());
+		return;
+	}
+
+	Common::SeekableReadStreamEndian *sndData = archive->getResource(tag, id);
+	if (sndData != nullptr) {
+		SNDDecoder *ad = new SNDDecoder();
+		ad->loadStream(*sndData);
+		delete sndData;
+		Audio::AudioStream *as = ad->getAudioStream();
+
+		if (!as) {
+			warning("FPlayXObj::b_fplay: failed to get audio stream");
+			return;
+		}
+		sound->playStream(*as, 1);
+		//		delete audio;
+	}
 }
 
 void FPlayXObj::b_sndinfo(int nargs) {


Commit: a1ed269f1bf1d5ffeff1733e57b7ce842a9d0f2a
    https://github.com/scummvm/scummvm/commit/a1ed269f1bf1d5ffeff1733e57b7ce842a9d0f2a
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-12T14:15:25+08:00

Commit Message:
DIRECTOR: support continuous argument for fplay

Changed paths:
    engines/director/lingo/xlibs/fplayxobj.cpp


diff --git a/engines/director/lingo/xlibs/fplayxobj.cpp b/engines/director/lingo/xlibs/fplayxobj.cpp
index 1a26a47a1a..224bb60882 100644
--- a/engines/director/lingo/xlibs/fplayxobj.cpp
+++ b/engines/director/lingo/xlibs/fplayxobj.cpp
@@ -60,13 +60,25 @@ void FPlayXObj::initialize(int type) {
 
 void FPlayXObj::b_fplay(int nargs) {
 	if (nargs == 0) {
-		warning("FPlayXObj::b_fplay requires at least one argument");
+		warning("FPlayXObj::b_fplay: requires at least one argument");
 		return;
 	}
 
-	if (nargs > 1) {
-		g_lingo->dropStack(nargs - 1);
-		warning("FPlayXObj::b_fplay unhandled %d arguments", nargs - 1);
+	if (nargs > 2) {
+		g_lingo->dropStack(nargs - 2);
+		warning("FPlayXObj::b_fplay: unhandled %d arguments", nargs - 2);
+	}
+
+	Common::String mode;
+	if (nargs == 2)
+		mode = g_lingo->pop().asString();
+
+	bool loop = false;
+	if (!mode.empty()) {
+		if (mode.equalsIgnoreCase("continuous"))
+			loop = true;
+		else
+			warning("FPlayXObj::b_fplay: unhandled mode %s", mode.c_str());
 	}
 
 	Datum d = g_lingo->pop();
@@ -92,7 +104,7 @@ void FPlayXObj::b_fplay(int nargs) {
 	}
 
 	if (id == 0xFFFF) {
-		warning("FPlayXObj::b_fplay can not find sound %s", sndName.c_str());
+		warning("FPlayXObj::b_fplay: can not find sound %s", sndName.c_str());
 		return;
 	}
 
@@ -101,14 +113,19 @@ void FPlayXObj::b_fplay(int nargs) {
 		SNDDecoder *ad = new SNDDecoder();
 		ad->loadStream(*sndData);
 		delete sndData;
-		Audio::AudioStream *as = ad->getAudioStream();
+
+		Audio::AudioStream *as;
+		if (loop)
+			as = ad->getLoopingAudioStream();
+		else
+			as = ad->getAudioStream();
 
 		if (!as) {
 			warning("FPlayXObj::b_fplay: failed to get audio stream");
 			return;
 		}
 		sound->playStream(*as, 1);
-		//		delete audio;
+		delete ad;
 	}
 }
 




More information about the Scummvm-git-logs mailing list