[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