aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorEugene Sandulenko2016-10-21 10:12:58 +0200
committerEugene Sandulenko2016-10-21 10:32:48 +0200
commitc8dca575557d836c50b17fe6b5cf6e9f6c0a6a27 (patch)
tree8b7880664bfedad4edf636801be957aab871f879 /engines
parent990bd641ae348f2340c6231d49e6fdcc0404ea29 (diff)
downloadscummvm-rg350-c8dca575557d836c50b17fe6b5cf6e9f6c0a6a27.tar.gz
scummvm-rg350-c8dca575557d836c50b17fe6b5cf6e9f6c0a6a27.tar.bz2
scummvm-rg350-c8dca575557d836c50b17fe6b5cf6e9f6c0a6a27.zip
PRINCE: Refactored detection code into widely accepted schema
Diffstat (limited to 'engines')
-rw-r--r--engines/prince/detection.cpp215
-rw-r--r--engines/prince/detection.h150
-rw-r--r--engines/prince/prince.cpp2
-rw-r--r--engines/prince/prince.h24
-rw-r--r--engines/prince/saveload.cpp99
5 files changed, 227 insertions, 263 deletions
diff --git a/engines/prince/detection.cpp b/engines/prince/detection.cpp
index a081e683b1..8e7fbd7197 100644
--- a/engines/prince/detection.cpp
+++ b/engines/prince/detection.cpp
@@ -20,7 +20,7 @@
*
*/
-#include "prince/detection.h"
+#include "prince/prince.h"
namespace Prince {
@@ -40,14 +40,116 @@ Common::Language PrinceEngine::getLanguage() const {
return _gameDescription->desc.language;
}
-bool PrinceMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
- using namespace Prince;
- const PrinceGameDescription *gd = (const PrinceGameDescription *)desc;
- if (gd) {
- *engine = new PrinceEngine(syst, gd);
+} // End of namespace Prince
+
+static const PlainGameDescriptor princeGames[] = {
+ {"prince", "Prince Game"},
+ {0, 0}
+};
+
+namespace Prince {
+static const PrinceGameDescription gameDescriptions[] = {
+ {
+ {
+ "prince",
+ "Galador",
+ AD_ENTRY1s("databank.ptc", "5fa03833177331214ec1354761b1d2ee", 3565031),
+ Common::DE_DEU,
+ Common::kPlatformWindows,
+ ADGF_TESTING,
+ GUIO1(GUIO_NONE)
+ },
+ kPrinceDataDE
+ },
+ {
+ {
+ "prince",
+ "Ksiaze i Tchorz",
+ AD_ENTRY1s("databank.ptc", "48ec9806bda9d152acbea8ce31c93c49", 3435298),
+ Common::PL_POL,
+ Common::kPlatformWindows,
+ ADGF_TESTING,
+ GUIO1(GUIO_NONE)
+ },
+ kPrinceDataPL
+ },
+ {
+ {
+ "prince",
+ "Galador",
+ AD_ENTRY1s("talktxt.dat", "02bb2372f19aca3c65896ed81b2cefb3", 125702),
+ Common::RU_RUS,
+ Common::kPlatformWindows,
+ ADGF_TESTING,
+ GUIO1(GUIO_NONE)
+ },
+ kPrinceDataDE
+ },
+ {
+ {
+ "prince",
+ "The Prince and the Coward",
+ {
+ {"databank.ptc", 0, "5fa03833177331214ec1354761b1d2ee", 3565031},
+ {"prince_translation.dat", 0, 0, -1},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_TESTING | GF_TRANSLATED,
+ GUIO1(GUIO_NONE)
+ },
+ kPrinceDataDE
+ },
+ {
+ {
+ "prince",
+ "The Prince and the Coward",
+ {
+ {"databank.ptc", 0, "48ec9806bda9d152acbea8ce31c93c49", 3435298},
+ {"prince_translation.dat", 0, 0, -1},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_TESTING | GF_TRANSLATED,
+ GUIO1(GUIO_NONE)
+ },
+ kPrinceDataPL
+ },
+ { AD_TABLE_END_MARKER, kPrinceDataUNK }
+};
+
+} // End of namespace Prince
+
+const static char *directoryGlobs[] = {
+ "all",
+ 0
+};
+
+class PrinceMetaEngine : public AdvancedMetaEngine {
+public:
+ PrinceMetaEngine() : AdvancedMetaEngine(Prince::gameDescriptions, sizeof(Prince::PrinceGameDescription), princeGames) {
+ _singleId = "prince";
+ _maxScanDepth = 2;
+ _directoryGlobs = directoryGlobs;
}
- return gd != 0;
-}
+
+ virtual const char *getName() const {
+ return "Prince Engine";
+ }
+
+ virtual const char *getOriginalCopyright() const {
+ return "The Prince and the Coward (C) 1996-97 Metropolis";
+ }
+
+ virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+ virtual bool hasFeature(MetaEngineFeature f) const;
+ virtual int getMaximumSaveSlot() const { return 99; }
+ virtual SaveStateList listSaves(const char *target) const;
+ SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+ virtual void removeSaveState(const char *target, int slot) const;
+};
bool PrinceMetaEngine::hasFeature(MetaEngineFeature f) const {
return
@@ -67,10 +169,101 @@ bool Prince::PrinceEngine::hasFeature(EngineFeature f) const {
(f == kSupportsRTL);
}
-} // End of namespace Prince
+SaveStateList PrinceMetaEngine::listSaves(const char *target) const {
+ Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+ Common::StringArray filenames;
+ Common::String pattern = target;
+ pattern += ".###";
+
+ filenames = saveFileMan->listSavefiles(pattern);
+ sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
+
+ SaveStateList saveList;
+ for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); filename++) {
+ // Obtain the last 3 digits of the filename, since they correspond to the save slot
+ int slotNum = atoi(filename->c_str() + filename->size() - 3);
+
+ if (slotNum >= 0 && slotNum <= 99) {
+
+ Common::InSaveFile *file = saveFileMan->openForLoading(*filename);
+ if (file) {
+ Prince::SavegameHeader header;
+
+ // Check to see if it's a ScummVM savegame or not
+ char buffer[kSavegameStrSize + 1];
+ file->read(buffer, kSavegameStrSize + 1);
+
+ if (!strncmp(buffer, kSavegameStr, kSavegameStrSize + 1)) {
+ // Valid savegame
+ if (Prince::PrinceEngine::readSavegameHeader(file, header)) {
+ saveList.push_back(SaveStateDescriptor(slotNum, header.saveName));
+ if (header.thumbnail) {
+ header.thumbnail->free();
+ delete header.thumbnail;
+ }
+ }
+ } else {
+ // Must be an original format savegame
+ saveList.push_back(SaveStateDescriptor(slotNum, "Unknown"));
+ }
+
+ delete file;
+ }
+ }
+ }
+
+ return saveList;
+}
+
+SaveStateDescriptor PrinceMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+ Common::String fileName = Common::String::format("%s.%03d", target, slot);
+ Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName);
+
+ if (f) {
+ Prince::SavegameHeader header;
+
+ // Check to see if it's a ScummVM savegame or not
+ char buffer[kSavegameStrSize + 1];
+ f->read(buffer, kSavegameStrSize + 1);
+
+ bool hasHeader = !strncmp(buffer, kSavegameStr, kSavegameStrSize + 1) &&
+ Prince::PrinceEngine::readSavegameHeader(f, header);
+ delete f;
+
+ if (!hasHeader) {
+ // Original savegame perhaps?
+ SaveStateDescriptor desc(slot, "Unknown");
+ return desc;
+ } else {
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header.saveName);
+ desc.setThumbnail(header.thumbnail);
+ desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
+ desc.setSaveTime(header.saveHour, header.saveMinutes);
+
+ return desc;
+ }
+ }
+
+ return SaveStateDescriptor();
+}
+
+void PrinceMetaEngine::removeSaveState(const char *target, int slot) const {
+ Common::String fileName = Common::String::format("%s.%03d", target, slot);
+ g_system->getSavefileManager()->removeSavefile(fileName);
+}
+
+bool PrinceMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+ using namespace Prince;
+ const PrinceGameDescription *gd = (const PrinceGameDescription *)desc;
+ if (gd) {
+ *engine = new PrinceEngine(syst, gd);
+ }
+ return gd != 0;
+}
#if PLUGIN_ENABLED_DYNAMIC(PRINCE)
-REGISTER_PLUGIN_DYNAMIC(PRINCE, PLUGIN_TYPE_ENGINE, Prince::PrinceMetaEngine);
+REGISTER_PLUGIN_DYNAMIC(PRINCE, PLUGIN_TYPE_ENGINE, PrinceMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(PRINCE, PLUGIN_TYPE_ENGINE, Prince::PrinceMetaEngine);
+REGISTER_PLUGIN_STATIC(PRINCE, PLUGIN_TYPE_ENGINE, PrinceMetaEngine);
#endif
diff --git a/engines/prince/detection.h b/engines/prince/detection.h
deleted file mode 100644
index b3d6153d38..0000000000
--- a/engines/prince/detection.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/* 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 2
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef PRINCE_DETECTION_H
-#define PRINCE_DETECTION_H
-
-#include "prince/prince.h"
-#include "engines/advancedDetector.h"
-
-namespace Prince {
-
-enum PrinceGameType {
- kPrinceDataUNK,
- kPrinceDataDE,
- kPrinceDataPL
-};
-
-struct PrinceGameDescription {
- ADGameDescription desc;
- PrinceGameType gameType;
-};
-
-static const PlainGameDescriptor princeGames[] = {
- {"prince", "Prince Game"},
- {0, 0}
-};
-
-static const PrinceGameDescription gameDescriptions[] = {
- {
- {
- "prince",
- "Galador",
- AD_ENTRY1s("databank.ptc", "5fa03833177331214ec1354761b1d2ee", 3565031),
- Common::DE_DEU,
- Common::kPlatformWindows,
- ADGF_TESTING,
- GUIO1(GUIO_NONE)
- },
- kPrinceDataDE
- },
- {
- {
- "prince",
- "Ksiaze i Tchorz",
- AD_ENTRY1s("databank.ptc", "48ec9806bda9d152acbea8ce31c93c49", 3435298),
- Common::PL_POL,
- Common::kPlatformWindows,
- ADGF_TESTING,
- GUIO1(GUIO_NONE)
- },
- kPrinceDataPL
- },
- {
- {
- "prince",
- "Galador",
- AD_ENTRY1s("talktxt.dat", "02bb2372f19aca3c65896ed81b2cefb3", 125702),
- Common::RU_RUS,
- Common::kPlatformWindows,
- ADGF_TESTING,
- GUIO1(GUIO_NONE)
- },
- kPrinceDataDE
- },
- {
- {
- "prince",
- "The Prince and the Coward",
- {
- {"databank.ptc", 0, "5fa03833177331214ec1354761b1d2ee", 3565031},
- {"prince_translation.dat", 0, 0, -1},
- AD_LISTEND
- },
- Common::EN_ANY,
- Common::kPlatformWindows,
- ADGF_TESTING | GF_TRANSLATED,
- GUIO1(GUIO_NONE)
- },
- kPrinceDataDE
- },
- {
- {
- "prince",
- "The Prince and the Coward",
- {
- {"databank.ptc", 0, "48ec9806bda9d152acbea8ce31c93c49", 3435298},
- {"prince_translation.dat", 0, 0, -1},
- AD_LISTEND
- },
- Common::EN_ANY,
- Common::kPlatformWindows,
- ADGF_TESTING | GF_TRANSLATED,
- GUIO1(GUIO_NONE)
- },
- kPrinceDataPL
- },
- { AD_TABLE_END_MARKER, kPrinceDataUNK }
-};
-
-const static char *directoryGlobs[] = {
- "all",
- 0
-};
-
-class PrinceMetaEngine : public AdvancedMetaEngine {
-public:
- PrinceMetaEngine() : AdvancedMetaEngine(Prince::gameDescriptions, sizeof(Prince::PrinceGameDescription), princeGames) {
- _singleId = "prince";
- _maxScanDepth = 2;
- _directoryGlobs = directoryGlobs;
- }
-
- virtual const char *getName() const {
- return "Prince Engine";
- }
-
- virtual const char *getOriginalCopyright() const {
- return "The Prince and the Coward (C) 1996-97 Metropolis";
- }
-
- virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
- virtual bool hasFeature(MetaEngineFeature f) const;
- virtual int getMaximumSaveSlot() const;
- virtual SaveStateList listSaves(const char *target) const;
- SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
- virtual void removeSaveState(const char *target, int slot) const;
-};
-
-} // End of namespace Prince
-
-#endif
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp
index 903f609d80..016428935c 100644
--- a/engines/prince/prince.cpp
+++ b/engines/prince/prince.cpp
@@ -38,7 +38,6 @@
#include "graphics/pixelformat.h"
#include "engines/util.h"
-#include "engines/advancedDetector.h"
#include "audio/audiostream.h"
#include "audio/decoders/wave.h"
@@ -62,7 +61,6 @@
#include "prince/animation.h"
#include "prince/option_text.h"
#include "prince/curve_values.h"
-#include "prince/detection.h"
namespace Prince {
diff --git a/engines/prince/prince.h b/engines/prince/prince.h
index ee952ec5cc..32e37e0774 100644
--- a/engines/prince/prince.h
+++ b/engines/prince/prince.h
@@ -38,6 +38,7 @@
#include "gui/debugger.h"
+#include "engines/advancedDetector.h"
#include "engines/engine.h"
#include "engines/util.h"
@@ -51,7 +52,17 @@
namespace Prince {
-struct PrinceGameDescription;
+enum PrinceGameType {
+ kPrinceDataUNK,
+ kPrinceDataDE,
+ kPrinceDataPL
+};
+
+struct PrinceGameDescription {
+ ADGameDescription desc;
+ PrinceGameType gameType;
+};
+
struct SavegameHeader;
class PrinceEngine;
@@ -74,6 +85,17 @@ enum {
GF_TRANSLATED = 1 << 0
};
+struct SavegameHeader {
+ uint8 version;
+ Common::String saveName;
+ Graphics::Surface *thumbnail;
+ int saveYear, saveMonth, saveDay;
+ int saveHour, saveMinutes;
+};
+
+#define kSavegameStrSize 14
+#define kSavegameStr "SCUMMVM_PRINCE"
+
struct Text {
const char *_str;
uint16 _x, _y;
diff --git a/engines/prince/saveload.cpp b/engines/prince/saveload.cpp
index d0498f13e4..14f6078910 100644
--- a/engines/prince/saveload.cpp
+++ b/engines/prince/saveload.cpp
@@ -22,7 +22,6 @@
#include "prince/prince.h"
#include "prince/graphics.h"
-#include "prince/detection.h"
#include "prince/flags.h"
#include "prince/script.h"
#include "prince/hero.h"
@@ -41,103 +40,10 @@ namespace Prince {
#define kBadSVG 99
#define kSavegameVersion 1
-#define kSavegameStrSize 14
-#define kSavegameStr "SCUMMVM_PRINCE"
class InterpreterFlags;
class Interpreter;
-struct SavegameHeader {
- uint8 version;
- Common::String saveName;
- Graphics::Surface *thumbnail;
- int saveYear, saveMonth, saveDay;
- int saveHour, saveMinutes;
-};
-
-int PrinceMetaEngine::getMaximumSaveSlot() const {
- return 99;
-}
-
-SaveStateList PrinceMetaEngine::listSaves(const char *target) const {
- Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
- Common::StringArray filenames;
- Common::String pattern = target;
- pattern += ".###";
-
- filenames = saveFileMan->listSavefiles(pattern);
- sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
-
- SaveStateList saveList;
- for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); filename++) {
- // Obtain the last 3 digits of the filename, since they correspond to the save slot
- int slotNum = atoi(filename->c_str() + filename->size() - 3);
-
- if (slotNum >= 0 && slotNum <= 99) {
-
- Common::InSaveFile *file = saveFileMan->openForLoading(*filename);
- if (file) {
- Prince::SavegameHeader header;
-
- // Check to see if it's a ScummVM savegame or not
- char buffer[kSavegameStrSize + 1];
- file->read(buffer, kSavegameStrSize + 1);
-
- if (!strncmp(buffer, kSavegameStr, kSavegameStrSize + 1)) {
- // Valid savegame
- if (Prince::PrinceEngine::readSavegameHeader(file, header)) {
- saveList.push_back(SaveStateDescriptor(slotNum, header.saveName));
- if (header.thumbnail) {
- header.thumbnail->free();
- delete header.thumbnail;
- }
- }
- } else {
- // Must be an original format savegame
- saveList.push_back(SaveStateDescriptor(slotNum, "Unknown"));
- }
-
- delete file;
- }
- }
- }
-
- return saveList;
-}
-
-SaveStateDescriptor PrinceMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
- Common::String fileName = Common::String::format("%s.%03d", target, slot);
- Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName);
-
- if (f) {
- Prince::SavegameHeader header;
-
- // Check to see if it's a ScummVM savegame or not
- char buffer[kSavegameStrSize + 1];
- f->read(buffer, kSavegameStrSize + 1);
-
- bool hasHeader = !strncmp(buffer, kSavegameStr, kSavegameStrSize + 1) &&
- Prince::PrinceEngine::readSavegameHeader(f, header);
- delete f;
-
- if (!hasHeader) {
- // Original savegame perhaps?
- SaveStateDescriptor desc(slot, "Unknown");
- return desc;
- } else {
- // Create the return descriptor
- SaveStateDescriptor desc(slot, header.saveName);
- desc.setThumbnail(header.thumbnail);
- desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
- desc.setSaveTime(header.saveHour, header.saveMinutes);
-
- return desc;
- }
- }
-
- return SaveStateDescriptor();
-}
-
bool PrinceEngine::readSavegameHeader(Common::InSaveFile *in, SavegameHeader &header) {
header.thumbnail = nullptr;
@@ -167,11 +73,6 @@ bool PrinceEngine::readSavegameHeader(Common::InSaveFile *in, SavegameHeader &he
return true;
}
-void PrinceMetaEngine::removeSaveState(const char *target, int slot) const {
- Common::String fileName = Common::String::format("%s.%03d", target, slot);
- g_system->getSavefileManager()->removeSavefile(fileName);
-}
-
bool PrinceEngine::canSaveGameStateCurrently() {
if (_mouseFlag && _mouseFlag != 3) {
if (_mainHero->_visible) {