AGI: Create AgiLoader method for locating disk images

This commit is contained in:
sluicebox committed 2025-01-23 03:18:14 -08:00
1 parent be53239eef
commit 0ffed94e13
5 files changed
+74 -49

No files matched your search

+62
View File
@@ -0,0 +1,62 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "agi/agi.h"
#include "agi/loader.h"
#include "common/config-manager.h"
#include "common/fs.h"
namespace Agi {
void AgiLoader::getPotentialDiskImages(
const char * const *imageExtensions,
size_t imageExtensionCount,
Common::Array<Common::Path> &imageFiles,
FileMap &fileMap) {
// get all files in game directory
Common::FSList allFiles;
Common::FSNode dir(ConfMan.getPath("path"));
if (!dir.getChildren(allFiles, Common::FSNode::kListFilesOnly)) {
warning("invalid game path: %s", dir.getPath().toString(Common::Path::kNativeSeparator).c_str());
return;
}
// build array of files with provided disk image extensions
for (const Common::FSNode &file : allFiles) {
for (size_t i = 0; i < imageExtensionCount; i++) {
if (file.getName().hasSuffixIgnoreCase(imageExtensions[i])) {
Common::Path path = file.getPath();
imageFiles.push_back(path);
fileMap[path] = file;
break;
}
}
}
// sort potential image files by name.
// this is an important step for consistent results,
// and because the first disk is likely to be first.
Common::sort(imageFiles.begin(), imageFiles.end());
}
} // End of namespace Agi
+7
View File
@@ -58,6 +58,13 @@ public:
protected:
AgiEngine *_vm;
typedef Common::HashMap<Common::Path, Common::FSNode, Common::Path::IgnoreCase_Hash, Common::Path::IgnoreCase_EqualTo> FileMap;
static void getPotentialDiskImages(
const char * const *imageExtensions,
size_t imageExtensionCount,
Common::Array<Common::Path> &imageFiles,
FileMap &fileMap);
};
struct AgiDiskVolume {
+2 -25
View File
@@ -24,7 +24,6 @@
#include "agi/loader.h"
#include "agi/words.h"
#include "common/config-manager.h"
#include "common/formats/disk_image.h"
#include "common/fs.h"
#include "common/memstream.h"
@@ -59,8 +58,6 @@ namespace Agi {
// AgiMetaEngineDetection also scans for usable disk images. It finds the LOGDIR
// file inside disk one, hashes LOGDIR, and matches against the detection table.
typedef Common::HashMap<Common::Path, Common::FSNode, Common::Path::IgnoreCase_Hash, Common::Path::IgnoreCase_EqualTo> FileMap;
AgiLoader_A2::~AgiLoader_A2() {
for (uint d = 0; d < _disks.size(); d++) {
delete _disks[d];
@@ -68,30 +65,10 @@ AgiLoader_A2::~AgiLoader_A2() {
}
void AgiLoader_A2::init() {
// get all files in game directory
Common::FSList allFiles;
Common::FSNode dir(ConfMan.getPath("path"));
if (!dir.getChildren(allFiles, Common::FSNode::kListFilesOnly)) {
warning("AgiLoader_A2: invalid game path: %s", dir.getPath().toString(Common::Path::kNativeSeparator).c_str());
return;
}
// build array of files with a2 disk image extensions
// build sorted array of files with image extensions
Common::Array<Common::Path> imageFiles;
FileMap fileMap;
for (const Common::FSNode &file : allFiles) {
for (int i = 0; i < ARRAYSIZE(a2DiskImageExtensions); i++) {
if (file.getName().hasSuffixIgnoreCase(a2DiskImageExtensions[i])) {
Common::Path path = file.getPath();
imageFiles.push_back(path);
fileMap[path] = file;
break;
}
}
}
// sort potential image files by name
Common::sort(imageFiles.begin(), imageFiles.end());
getPotentialDiskImages(a2DiskImageExtensions, ARRAYSIZE(a2DiskImageExtensions), imageFiles, fileMap);
// find disk one by reading potential images until successful
int diskCount = 0;
+2 -24
View File
@@ -24,7 +24,6 @@
#include "agi/loader.h"
#include "agi/words.h"
#include "common/config-manager.h"
#include "common/fs.h"
namespace Agi {
@@ -50,32 +49,11 @@ namespace Agi {
// AgiMetaEngineDetection also scans for usable disk images. It finds the LOGDIR
// file inside disk one, hashes LOGDIR, and matches against the detection table.
typedef Common::HashMap<Common::Path, Common::FSNode, Common::Path::IgnoreCase_Hash, Common::Path::IgnoreCase_EqualTo> FileMap;
void AgiLoader_v1::init() {
// get all files in game directory
Common::FSList allFiles;
Common::FSNode dir(ConfMan.getPath("path"));
if (!dir.getChildren(allFiles, Common::FSNode::kListFilesOnly)) {
warning("AgiLoader_v1: invalid game path: %s", dir.getPath().toString(Common::Path::kNativeSeparator).c_str());
return;
}
// build array of files with pc disk image extensions
// build sorted array of files with image extensions
Common::Array<Common::Path> imageFiles;
FileMap fileMap;
for (const Common::FSNode &file : allFiles) {
for (int i = 0; i < ARRAYSIZE(pcDiskImageExtensions); i++) {
if (file.getName().hasSuffixIgnoreCase(pcDiskImageExtensions[i])) {
Common::Path path = file.getPath();
imageFiles.push_back(path);
fileMap[path] = file;
}
}
}
// sort potential image files by name
Common::sort(imageFiles.begin(), imageFiles.end());
getPotentialDiskImages(pcDiskImageExtensions, ARRAYSIZE(pcDiskImageExtensions), imageFiles, fileMap);
// find disk one by reading potential images until successful
uint diskOneIndex;
+1
View File
@@ -11,6 +11,7 @@ MODULE_OBJS := \
graphics.o \
inv.o \
keyboard.o \
loader.o \
loader_a2.o \
loader_v1.o \
loader_v2.o \