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 \