mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
AGI: Create AgiLoader method for locating disk images
This commit is contained in:
1 parent
be53239eef
commit
0ffed94e13
5 files changed
+74
-49
No files matched your search
@@ -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
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -11,6 +11,7 @@ MODULE_OBJS := \
|
||||
graphics.o \
|
||||
inv.o \
|
||||
keyboard.o \
|
||||
loader.o \
|
||||
loader_a2.o \
|
||||
loader_v1.o \
|
||||
loader_v2.o \
|
||||
|
||||
Reference in new issue
Block a user