diff --git a/engines/agi/loader.cpp b/engines/agi/loader.cpp
new file mode 100644
index 00000000000..0287b2e08ce
--- /dev/null
+++ b/engines/agi/loader.cpp
@@ -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 .
+ *
+ */
+
+#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 &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
diff --git a/engines/agi/loader.h b/engines/agi/loader.h
index 2f5bebbbabd..afd23471e26 100644
--- a/engines/agi/loader.h
+++ b/engines/agi/loader.h
@@ -58,6 +58,13 @@ public:
protected:
AgiEngine *_vm;
+
+ typedef Common::HashMap FileMap;
+ static void getPotentialDiskImages(
+ const char * const *imageExtensions,
+ size_t imageExtensionCount,
+ Common::Array &imageFiles,
+ FileMap &fileMap);
};
struct AgiDiskVolume {
diff --git a/engines/agi/loader_a2.cpp b/engines/agi/loader_a2.cpp
index 92653e7817f..3e52ffa198c 100644
--- a/engines/agi/loader_a2.cpp
+++ b/engines/agi/loader_a2.cpp
@@ -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 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 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;
diff --git a/engines/agi/loader_v1.cpp b/engines/agi/loader_v1.cpp
index dbb653964b0..36e8be6c07f 100644
--- a/engines/agi/loader_v1.cpp
+++ b/engines/agi/loader_v1.cpp
@@ -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 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 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;
diff --git a/engines/agi/module.mk b/engines/agi/module.mk
index b79da837f3c..5bb986a11c8 100644
--- a/engines/agi/module.mk
+++ b/engines/agi/module.mk
@@ -11,6 +11,7 @@ MODULE_OBJS := \
graphics.o \
inv.o \
keyboard.o \
+ loader.o \
loader_a2.o \
loader_v1.o \
loader_v2.o \