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

dreammaster noreply at scummvm.org
Thu Apr 25 03:46:07 UTC 2024


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

Summary:
3902c07d74 COMMON: Use matchPathComponents param in FSDirectory::listMatchingMembers
9f6ed97a85 ULTIMA: Implement UltimaDataArchiveProxy::listMatchingMembers()
f171351ac4 ULTIMA: Implement UltimaDataArchiveProxy::listMembers()
472f322660 ULTIMA: Implement UltimaDataArchiveProxy::isPathDirectory()
078b882da0 ULTIMA: Fix UltimaDataArchiveMember::getFileName() infinite recursion
fc4cf9f573 ULTIMA: Implement UltimaDataArchive::isPathDirectory()
c28022ff41 ULTIMA: Implement UltimaDataArchiveMember::isDirectory()
f053d9c6ce ULTIMA: Rework UltimaDataArchive::listMatchingMembers
0963ca6ba6 ULTIMA: Simplify UltimaDataArchive::listMembers
05724bef55 ULTIMA: NUVIE: Make NuvieFileList::open() use SearchMan
cd85aaef62 ULTIMA: NUVIE: Do not ignore "search" parameter in NuvieFileList::open()


Commit: 3902c07d74ece770b759a40def22dc9684e7da37
    https://github.com/scummvm/scummvm/commit/3902c07d74ece770b759a40def22dc9684e7da37
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
COMMON: Use matchPathComponents param in FSDirectory::listMatchingMembers

Changed paths:
    common/fs.cpp


diff --git a/common/fs.cpp b/common/fs.cpp
index 87876adc429..147d7ae64db 100644
--- a/common/fs.cpp
+++ b/common/fs.cpp
@@ -479,20 +479,33 @@ int FSDirectory::listMatchingMembers(ArchiveMemberList &list, const Path &patter
 	ensureCached();
 
 	int matches = 0;
-	for (NodeCache::const_iterator it = _fileCache.begin(); it != _fileCache.end(); ++it) {
-		if (it->_key.matchPattern(pattern)) {
-			list.push_back(ArchiveMemberPtr(new FSDirectoryFile(it->_key, it->_value)));
-			matches++;
-		}
-	}
-	if (_includeDirectories) {
-		for (NodeCache::const_iterator it = _subDirCache.begin(); it != _subDirCache.end(); ++it) {
-			if (it->_key.matchPattern(pattern)) {
+	const char pathSep = getPathSeparator();
+	const char pathSepStr[] = {pathSep, '\0'};
+	const char *wildCardExclusions = matchPathComponents ? nullptr : pathSepStr;
+	Common::String patternStr;
+	if (matchPathComponents)
+		patternStr = pattern.toString(pathSep);
+
+	auto addMatchingToList = [&](const NodeCache &nodeCache) {
+		for (NodeCache::const_iterator it = nodeCache.begin(); it != nodeCache.end(); ++it) {
+			bool isMatch;
+			if (matchPathComponents) {
+				Common::String keyStr = it->_key.toString(pathSep);
+				isMatch = keyStr.matchString(patternStr, true, wildCardExclusions);
+			} else
+				isMatch = it->_key.matchPattern(pattern);
+
+			if (isMatch) {
 				list.push_back(ArchiveMemberPtr(new FSDirectoryFile(it->_key, it->_value)));
-				matches++;
+				++matches;
 			}
 		}
-	}
+	};
+
+	addMatchingToList(_fileCache);
+
+	if (_includeDirectories)
+			addMatchingToList(_subDirCache);
 
 	return matches;
 }


Commit: 9f6ed97a85f7dfd4ad36d62bd4744158cc812419
    https://github.com/scummvm/scummvm/commit/9f6ed97a85f7dfd4ad36d62bd4744158cc812419
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: Implement UltimaDataArchiveProxy::listMatchingMembers()

Changed paths:
    engines/ultima/shared/engine/data_archive.cpp
    engines/ultima/shared/engine/data_archive.h


diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index 5cf72d03762..5b0684f84a8 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -219,6 +219,19 @@ Common::FSNode UltimaDataArchiveProxy::getNode(const Common::Path &name) const {
 	return node;
 }
 
+int UltimaDataArchiveProxy::listMatchingMembers(Common::ArchiveMemberList &list,
+		const Common::Path &pattern, bool matchPathComponents) const {
+	// Let FSDirectory adjust the filenames for us by using its prefix feature.
+	// Note: dir is intentionally constructed again on each call to prevent stale entries due to caching:
+	// Since this proxy class is intended for use during development, picking up modifications while the
+	// game is running might be useful.
+	const int maxDepth = 255; // chosen arbitrarily
+	Common::FSDirectory dir(_publicFolder, _folder, maxDepth, false, false, true);
+	if (matchPathComponents && pattern == "*")
+		return dir.listMembers(list);
+	else
+		return dir.listMatchingMembers(list, pattern, matchPathComponents);
+}
 #endif
 
 } // End of namespace Shared
diff --git a/engines/ultima/shared/engine/data_archive.h b/engines/ultima/shared/engine/data_archive.h
index c607a54f53e..e0ae960f9eb 100644
--- a/engines/ultima/shared/engine/data_archive.h
+++ b/engines/ultima/shared/engine/data_archive.h
@@ -146,9 +146,7 @@ public:
 	 * @return the number of members added to list
 	 */
 	int listMatchingMembers(Common::ArchiveMemberList &list,
-			const Common::Path &pattern, bool matchPathComponents = false) const override {
-		return 0;
-	}
+			const Common::Path &pattern, bool matchPathComponents = false) const override;
 
 	/**
 	 * Add all members of the Archive to list.


Commit: f171351ac4d32254215f210c00228887cbdedd64
    https://github.com/scummvm/scummvm/commit/f171351ac4d32254215f210c00228887cbdedd64
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: Implement UltimaDataArchiveProxy::listMembers()

Changed paths:
    engines/ultima/shared/engine/data_archive.cpp
    engines/ultima/shared/engine/data_archive.h


diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index 5b0684f84a8..79b46713567 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -219,6 +219,10 @@ Common::FSNode UltimaDataArchiveProxy::getNode(const Common::Path &name) const {
 	return node;
 }
 
+int UltimaDataArchiveProxy::listMembers(Common::ArchiveMemberList &list) const {
+	return listMatchingMembers(list, "*", true);
+}
+
 int UltimaDataArchiveProxy::listMatchingMembers(Common::ArchiveMemberList &list,
 		const Common::Path &pattern, bool matchPathComponents) const {
 	// Let FSDirectory adjust the filenames for us by using its prefix feature.
diff --git a/engines/ultima/shared/engine/data_archive.h b/engines/ultima/shared/engine/data_archive.h
index e0ae960f9eb..cd3f495e3a3 100644
--- a/engines/ultima/shared/engine/data_archive.h
+++ b/engines/ultima/shared/engine/data_archive.h
@@ -154,9 +154,7 @@ public:
 	 *
 	 * @return the number of names added to list
 	 */
-	int listMembers(Common::ArchiveMemberList &list) const override {
-		return 0;
-	}
+	int listMembers(Common::ArchiveMemberList &list) const override;
 
 	/**
 	 * Returns a ArchiveMember representation of the given file.


Commit: 472f3226607f7651cf3e582f06e55b19c972d801
    https://github.com/scummvm/scummvm/commit/472f3226607f7651cf3e582f06e55b19c972d801
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: Implement UltimaDataArchiveProxy::isPathDirectory()

Changed paths:
    engines/ultima/shared/engine/data_archive.cpp
    engines/ultima/shared/engine/data_archive.h


diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index 79b46713567..83fd3a1f3c9 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -236,6 +236,10 @@ int UltimaDataArchiveProxy::listMatchingMembers(Common::ArchiveMemberList &list,
 	else
 		return dir.listMatchingMembers(list, pattern, matchPathComponents);
 }
+
+bool UltimaDataArchiveProxy::isPathDirectory(const Common::Path &path) const {
+	return getNode(path).isDirectory();
+}
 #endif
 
 } // End of namespace Shared
diff --git a/engines/ultima/shared/engine/data_archive.h b/engines/ultima/shared/engine/data_archive.h
index cd3f495e3a3..9ce2d5e0d36 100644
--- a/engines/ultima/shared/engine/data_archive.h
+++ b/engines/ultima/shared/engine/data_archive.h
@@ -169,6 +169,8 @@ public:
 	 */
 	Common::SeekableReadStream *createReadStreamForMember(
 		const Common::Path &path) const override;
+
+	bool isPathDirectory(const Common::Path &path) const override;
 };
 
 #endif


Commit: 078b882da0133c7f44575000ff993468f503a4d4
    https://github.com/scummvm/scummvm/commit/078b882da0133c7f44575000ff993468f503a4d4
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: Fix UltimaDataArchiveMember::getFileName() infinite recursion

Changed paths:
    engines/ultima/shared/engine/data_archive.cpp


diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index 83fd3a1f3c9..e5843a7ebd0 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -56,7 +56,7 @@ public:
 		return _member->getDisplayName();
 	}
 	
-	Common::String getFileName() const override { return getFileName(); }
+	Common::String getFileName() const override { return _member->getFileName(); }
 	Common::String getName() const override { return getPathInArchive().toString('/'); }
 };
 


Commit: fc4cf9f573301b09c4f5c2e340925c51e835cf08
    https://github.com/scummvm/scummvm/commit/fc4cf9f573301b09c4f5c2e340925c51e835cf08
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: Implement UltimaDataArchive::isPathDirectory()

Changed paths:
    engines/ultima/shared/engine/data_archive.cpp
    engines/ultima/shared/engine/data_archive.h


diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index e5843a7ebd0..d793a115951 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -180,6 +180,9 @@ Common::SeekableReadStream *UltimaDataArchive::createReadStreamForMember(const C
 	return nullptr;
 }
 
+bool UltimaDataArchive::isPathDirectory(const Common::Path &path) const {
+	return _zip->isPathDirectory(innerToPublic(path));
+}
 /*-------------------------------------------------------------------*/
 
 #ifndef RELEASE_BUILD
diff --git a/engines/ultima/shared/engine/data_archive.h b/engines/ultima/shared/engine/data_archive.h
index 9ce2d5e0d36..7f99ca8cb04 100644
--- a/engines/ultima/shared/engine/data_archive.h
+++ b/engines/ultima/shared/engine/data_archive.h
@@ -103,6 +103,8 @@ public:
 	 */
 	Common::SeekableReadStream *createReadStreamForMember(
 		const Common::Path &path) const override;
+
+	bool isPathDirectory(const Common::Path &path) const override;
 };
 
 #ifndef RELEASE_BUILD


Commit: c28022ff41fbc72fc1b378d7d1a53239c4a917c6
    https://github.com/scummvm/scummvm/commit/c28022ff41fbc72fc1b378d7d1a53239c4a917c6
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: Implement UltimaDataArchiveMember::isDirectory()

Changed paths:
    engines/ultima/shared/engine/data_archive.cpp


diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index d793a115951..f6b2dac64e1 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -58,6 +58,8 @@ public:
 	
 	Common::String getFileName() const override { return _member->getFileName(); }
 	Common::String getName() const override { return getPathInArchive().toString('/'); }
+
+	bool isDirectory() const override { return _member->isDirectory(); }
 };
 
 /*-------------------------------------------------------------------*/


Commit: f053d9c6ce7d63d5a50dd582a50078d7df2d5064
    https://github.com/scummvm/scummvm/commit/f053d9c6ce7d63d5a50dd582a50078d7df2d5064
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: Rework UltimaDataArchive::listMatchingMembers

This makes sure patterns are correctly matched against the modified/
public path of each archive member.

Changed paths:
    engines/ultima/shared/engine/data_archive.cpp


diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index f6b2dac64e1..289dd95e16c 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -132,23 +132,24 @@ bool UltimaDataArchive::hasFile(const Common::Path &path) const {
 }
 
 int UltimaDataArchive::listMatchingMembers(Common::ArchiveMemberList &list, const Common::Path &pattern, bool matchPathComponents) const {
-	Common::Path patt(pattern);
-	if (patt.isRelativeTo(_publicFolder))
-		patt = innerToPublic(patt);
-
-	// Get any matching files
 	Common::ArchiveMemberList innerList;
-	int result = _zip->listMatchingMembers(innerList, patt);
+	int numMatches = 0;
+	// Test whether we can skip filtering.
+	bool matchAll = matchPathComponents && pattern == "*";
 
-	// Modify the results to change the filename
-	for (Common::ArchiveMemberList::iterator it = innerList.begin();
-			it != innerList.end(); ++it) {
+	// First, get all zip members relevant to the current game
+	_zip->listMatchingMembers(innerList, _innerfolder.appendComponent("*"), true);
+
+	// Modify the results to change the filename, then filter with pattern
+	for (const auto &innerMember : innerList) {
 		Common::ArchiveMemberPtr member = Common::ArchiveMemberPtr(
-			new UltimaDataArchiveMember(*it, _innerfolder));
-		list.push_back(member);
+			new UltimaDataArchiveMember(innerMember, _innerfolder));
+		if (matchAll || member->getPathInArchive().toString().matchString(pattern.toString(), true, matchPathComponents ? nullptr : "/")) {
+			list.push_back(member);
+			++numMatches;
+		}
 	}
-
-	return result;
+	return numMatches;
 }
 
 int UltimaDataArchive::listMembers(Common::ArchiveMemberList &list) const {


Commit: 0963ca6ba63c3244b694a3551723b5e97adbe238
    https://github.com/scummvm/scummvm/commit/0963ca6ba63c3244b694a3551723b5e97adbe238
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: Simplify UltimaDataArchive::listMembers

Changed paths:
    engines/ultima/shared/engine/data_archive.cpp


diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index 289dd95e16c..fb19907eb02 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -153,18 +153,7 @@ int UltimaDataArchive::listMatchingMembers(Common::ArchiveMemberList &list, cons
 }
 
 int UltimaDataArchive::listMembers(Common::ArchiveMemberList &list) const {
-	Common::ArchiveMemberList innerList;
-	int result = _zip->listMembers(innerList);
-
-	// Modify the results to change the filename
-	for (Common::ArchiveMemberList::iterator it = innerList.begin();
-		it != innerList.end(); ++it) {
-		Common::ArchiveMemberPtr member = Common::ArchiveMemberPtr(
-			new UltimaDataArchiveMember(*it, _innerfolder));
-		list.push_back(member);
-	}
-
-	return result;
+	return listMatchingMembers(list, "*", true);
 }
 
 const Common::ArchiveMemberPtr UltimaDataArchive::getMember(const Common::Path &path) const {


Commit: 05724bef5523d828358219ce9350bf165e3c4e10
    https://github.com/scummvm/scummvm/commit/05724bef5523d828358219ce9350bf165e3c4e10
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: NUVIE: Make NuvieFileList::open() use SearchMan

Fixes #14960
"The nuvie feature 'Use Custom Actor Tiles' is non functional"

Changed paths:
    engines/ultima/nuvie/files/nuvie_file_list.cpp
    engines/ultima/nuvie/files/nuvie_file_list.h


diff --git a/engines/ultima/nuvie/files/nuvie_file_list.cpp b/engines/ultima/nuvie/files/nuvie_file_list.cpp
index 297a3b457c5..c645b7b7247 100644
--- a/engines/ultima/nuvie/files/nuvie_file_list.cpp
+++ b/engines/ultima/nuvie/files/nuvie_file_list.cpp
@@ -36,23 +36,27 @@ NuvieFileList::~NuvieFileList() {
 }
 
 bool NuvieFileList::open(const Common::Path &directory, const char *search, uint8 s_mode) {
-	Common::FSNode dir(directory);
-	Common::FSList list;
+	Common::ArchiveMemberPtr arcMember = SearchMan.getMember(directory);
 
-	search_prefix.assign(search);
 	sort_mode = s_mode;
 
-	if (!dir.isDirectory()) {
+	if (!arcMember || !arcMember->isDirectory()) {
 		ConsoleAddWarning(Std::string("Failed to open ") + directory.toString());
 		return false;
 	}
 
-	if (!dir.getChildren(list, Common::FSNode::kListFilesOnly)) {
+	Common::ArchiveMemberList children;
+
+	arcMember->listChildren(children);
+	if (children.empty()) {
 		ConsoleAddWarning(Std::string("Failed to get children of ") + directory.toString());
 		return false;
 	};
-	for (const Common::FSNode &node : list)
-		add_filename(node);
+
+	for (const auto &child : children) {
+		if (!child->isDirectory())
+			add_filename(child->getFileName());
+	}
 
 	//sort list by time last modified in decending order.
 	Common::sort(file_list.begin(), file_list.end(), NuvieFileDesc());
@@ -60,10 +64,10 @@ bool NuvieFileList::open(const Common::Path &directory, const char *search, uint
 	return true;
 }
 
-bool NuvieFileList::add_filename(const Common::FSNode &file) {
+bool NuvieFileList::add_filename(const Common::String &fileName) {
 	NuvieFileDesc filedesc;
 	filedesc.m_time = 0;
-	filedesc.filename.assign(file.getFileName());
+	filedesc.filename = fileName;
 
 	file_list.push_front(filedesc);
 
diff --git a/engines/ultima/nuvie/files/nuvie_file_list.h b/engines/ultima/nuvie/files/nuvie_file_list.h
index 6fd6bf2a64d..3adbdfe1898 100644
--- a/engines/ultima/nuvie/files/nuvie_file_list.h
+++ b/engines/ultima/nuvie/files/nuvie_file_list.h
@@ -56,10 +56,9 @@ class NuvieFileList {
 protected:
 	Std::list<NuvieFileDesc> file_list;
 
-	Std::string search_prefix;
 	uint8 sort_mode;
 protected:
-	bool add_filename(const Common::FSNode &file);
+	bool add_filename(const Common::String &fileName);
 public:
 
 	NuvieFileList();


Commit: cd85aaef6251aed403f5a726d9d4b2507df05d4b
    https://github.com/scummvm/scummvm/commit/cd85aaef6251aed403f5a726d9d4b2507df05d4b
Author: PushmePullyu (127053144+PushmePullyu at users.noreply.github.com)
Date: 2024-04-24T20:46:00-07:00

Commit Message:
ULTIMA: NUVIE: Do not ignore "search" parameter in NuvieFileList::open()

Also correct search patterns at all call sites.

Changed paths:
    engines/ultima/nuvie/actors/actor_manager.cpp
    engines/ultima/nuvie/files/nuvie_file_list.cpp


diff --git a/engines/ultima/nuvie/actors/actor_manager.cpp b/engines/ultima/nuvie/actors/actor_manager.cpp
index d17d03231a5..063ae4c0fa0 100644
--- a/engines/ultima/nuvie/actors/actor_manager.cpp
+++ b/engines/ultima/nuvie/actors/actor_manager.cpp
@@ -1107,7 +1107,7 @@ void ActorManager::loadAvatarTiles(const Common::Path &datadir) {
 
 	uint8 avatar_portrait = Game::get_game()->get_portrait()->get_avatar_portrait_num();
 
-	Std::set<Std::string> files = getCustomTileFilenames(datadir, "avatar_");
+	Std::set<Std::string> files = getCustomTileFilenames(datadir, "avatar_###_####.bmp");
 
 	for (const Std::string &filename : files) {
 		if (filename.length() != 19) { // avatar_nnn_nnnn.bmp
@@ -1135,7 +1135,7 @@ void ActorManager::loadAvatarTiles(const Common::Path &datadir) {
 void ActorManager::loadNPCTiles(const Common::Path &datadir) {
 	Common::Path imagefile;
 
-	Std::set<Std::string> files = getCustomTileFilenames(datadir, "actor_");
+	Std::set<Std::string> files = getCustomTileFilenames(datadir, "actor_###_####.bmp");
 
 	for (const Std::string &filename : files) {
 		if (filename.length() != 18) { // actor_nnn_nnnn.bmp
diff --git a/engines/ultima/nuvie/files/nuvie_file_list.cpp b/engines/ultima/nuvie/files/nuvie_file_list.cpp
index c645b7b7247..463221b2f58 100644
--- a/engines/ultima/nuvie/files/nuvie_file_list.cpp
+++ b/engines/ultima/nuvie/files/nuvie_file_list.cpp
@@ -47,7 +47,7 @@ bool NuvieFileList::open(const Common::Path &directory, const char *search, uint
 
 	Common::ArchiveMemberList children;
 
-	arcMember->listChildren(children);
+	arcMember->listChildren(children, search);
 	if (children.empty()) {
 		ConsoleAddWarning(Std::string("Failed to get children of ") + directory.toString());
 		return false;




More information about the Scummvm-git-logs mailing list