ScummVM API documentation
metaengine.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef ENGINES_METAENGINE_H
23 #define ENGINES_METAENGINE_H
24 
25 #include "common/scummsys.h"
26 #include "common/error.h"
27 #include "common/array.h"
28 
29 #include "engines/achievements.h"
30 #include "engines/game.h"
31 #include "engines/savestate.h"
32 
33 #include "base/plugins.h"
34 
35 class Engine;
36 class OSystem;
37 
38 namespace Common {
39 class Keymap;
40 class FSList;
41 class OutSaveFile;
42 class String;
43 
44 typedef SeekableReadStream InSaveFile;
45 }
46 
47 namespace Graphics {
48 struct Surface;
49 }
50 
51 namespace GUI {
52 class GuiObject;
53 class OptionsContainerWidget;
54 }
55 
70  const char *label;
71  const char *tooltip;
72  const char *configOption;
73  bool defaultState;
74  byte groupId;
76 };
77 
82  uint32 channel;
83  const char *name;
84  const char *description;
85 };
86 
90 #define DEBUG_CHANNEL_END {0, NULL, NULL}
91 
96 
100 enum { kSavegameFilePattern = -99 };
101 
102 #define EXTENDED_SAVE_VERSION 4
103 
108  char id[6];
109  uint8 version;
112  uint32 date;
113  uint16 time;
114  uint32 playtime;
116  bool isAutosave;
119  memset(id, 0, 6);
120  version = 0;
121  date = 0;
122  time = 0;
123  playtime = 0;
124  thumbnail = nullptr;
125  isAutosave = false;
126  }
127 };
128 
140 public:
141  virtual ~MetaEngineDetection() {}
142 
144  virtual const char *getName() const = 0;
145 
147  virtual const char *getEngineName() const = 0;
148 
150  virtual const char *getOriginalCopyright() const = 0;
151 
153  virtual PlainGameList getSupportedGames() const = 0;
154 
156  virtual PlainGameDescriptor findGame(const char *gameId) const = 0;
157 
163  virtual DetectedGames detectGames(const Common::FSList &fslist, uint32 skipADFlags = 0, bool skipIncomplete = false) = 0;
164 
166  virtual uint getMD5Bytes() const = 0;
167 
169  virtual int getGameVariantCount() const {
170  return -1;
171  }
172 
174  virtual void dumpDetectionEntries() const = 0;
175 
183  virtual const DebugChannelDef *getDebugChannels() const {
184  return NULL;
185  }
186 };
187 
200 class MetaEngine : public PluginObject {
201 protected:
207  virtual void getSavegameThumbnail(Graphics::Surface &thumb);
208 
215  int findEmptySaveSlot(const char *target);
216 
231  virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const {
232  return ExtraGuiOptions();
233  }
234 
235 public:
236  virtual ~MetaEngine() {}
237 
248  virtual const char *getName() const = 0;
249 
263  virtual Common::Error createInstance(OSystem *syst, Engine **engine) = 0;
264 
284  virtual SaveStateList listSaves(const char *target) const;
285 
296  SaveStateList listSaves(const char *target, bool saveMode) const;
297 
304  virtual int getAutosaveSlot() const {
305  return 0;
306  }
307 
318  virtual int getMaximumSaveSlot() const {
319  // For games using the new save format, assume 99 slots by default
320  return hasFeature(kSavesUseExtendedFormat) ? 99 : 0;
321  }
322 
335  virtual void removeSaveState(const char *target, int slot) const;
336 
346  virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
347 
356  virtual Common::String getSavegameFile(int saveGameIdx, const char *target = nullptr) const;
357 
363  Common::String getSavegameFilePattern(const char *target = nullptr) const {
364  return getSavegameFile(kSavegameFilePattern, target);
365  }
366 
370  virtual Common::Array<Common::Keymap *> initKeymaps(const char *target) const;
371 
378  virtual void registerDefaultSettings(const Common::String &target) const;
379 
392  virtual GUI::OptionsContainerWidget *buildEngineOptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const;
393 
409 
414 
421 
437 
446 
455 
464 
482 
493  kSavesUseExtendedFormat
494  };
495 
503  virtual const Common::AchievementsInfo getAchievementsInfo(const Common::String &target) const;
504 
513  return nullptr;
514  }
515 
521  virtual bool hasFeature(MetaEngineFeature f) const;
522 
526  void appendExtendedSave(Common::OutSaveFile *saveFile, uint32 playtime, Common::String desc, bool isAutosave);
527 
531  void appendExtendedSaveToStream(Common::WriteStream *saveFile, uint32 playtime, Common::String desc, bool isAutosave, uint32 offset = 0);
532 
540  bool copySaveFileToFreeSlot(const char *target, int slot);
541 
545  static void parseSavegameHeader(ExtendedSavegameHeader *header, SaveStateDescriptor *desc);
551  static void fillDummyHeader(ExtendedSavegameHeader *header);
552 
556  static void decodeSavegameDate(const ExtendedSavegameHeader *header, uint16 &outYear, uint8 &outMonth, uint8 &outDay);
557 
561  static void decodeSavegameTime(const ExtendedSavegameHeader *header, uint8 &outHour, uint8 &outMinute);
562 
566  WARN_UNUSED_RESULT static bool readSavegameHeader(Common::InSaveFile *in, ExtendedSavegameHeader *header, bool skipThumbnail = true);
567 };
568 
572 class EngineManager : public Common::Singleton<EngineManager> {
573 public:
580  DetectionResults detectGames(const Common::FSList &fslist, uint32 skipADFlags = 0, bool skipIncomplete = false);
581 
583  const Plugin *findPlugin(const Common::String &engineId) const;
584 
592  const PluginList &getPlugins(const PluginType fetchPluginType = PLUGIN_TYPE_ENGINE_DETECTION) const;
593 
595  QualifiedGameDescriptor findTarget(const Common::String &target, const Plugin **plugin = NULL) const;
596 
604  QualifiedGameList findGamesMatching(const Common::String &engineId, const Common::String &gameId) const;
605 
611  Common::String createTargetForGame(const DetectedGame &game);
612 
614  void upgradeTargetIfNecessary(const Common::String &target) const;
615 
617  Common::String generateUniqueDomain(const Common::String gameId);
618 
619 private:
621  QualifiedGameList findGameInLoadedPlugins(const Common::String &gameId) const;
622 
624  void upgradeTargetForEngineId(const Common::String &target) const;
625 };
626 
628 #define EngineMan EngineManager::instance()
629 
630 #endif
virtual int getAutosaveSlot() const
Definition: metaengine.h:304
bool isAutosave
Definition: metaengine.h:116
Definition: game.h:79
Definition: metaengine.h:200
Definition: str.h:59
Definition: metaengine.h:481
Definition: surface.h:66
uint8 version
Definition: metaengine.h:109
MetaEngineFeature
Definition: metaengine.h:400
Definition: stream.h:77
Definition: savefile.h:54
Definition: error.h:84
Definition: metaengine.h:413
Definition: game.h:147
Common::String getSavegameFilePattern(const char *target=nullptr) const
Definition: metaengine.h:363
virtual int getMaximumSaveSlot() const
Definition: metaengine.h:318
Definition: metaengine.h:572
Definition: achievements.h:87
const char * label
Definition: metaengine.h:70
Definition: metaengine.h:445
Definition: game.h:64
byte groupLeaderId
Definition: metaengine.h:75
bool defaultState
Definition: metaengine.h:73
uint32 channel
Definition: metaengine.h:82
Definition: stream.h:745
Common::Array< ExtraGuiOption > ExtraGuiOptions
Definition: metaengine.h:95
Definition: system.h:45
Definition: game.h:49
Definition: object.h:60
Definition: plugins.h:145
Definition: widget.h:525
void upgradeTargetIfNecessary(const ObsoleteGameID *obsoleteList)
Definition: savestate.h:56
Definition: metaengine.h:69
Definition: metaengine.h:420
virtual const Common::AchievementDescriptionList * getAchievementDescriptionList() const
Definition: metaengine.h:512
Definition: game.h:245
virtual const DebugChannelDef * getDebugChannels() const
Definition: metaengine.h:183
Definition: metaengine.h:81
const char * name
Definition: metaengine.h:83
Definition: algorithm.h:29
Definition: formatinfo.h:28
Definition: metaengine.h:454
Definition: metaengine.h:436
bool skipThumbnail(Common::SeekableReadStream &in)
const char * configOption
Definition: metaengine.h:72
Definition: plugins.h:131
Definition: metaengine.h:139
Definition: fs.h:57
uint16 time
Definition: metaengine.h:113
const char * description
Definition: metaengine.h:84
Common::String saveName
Definition: metaengine.h:110
uint32 playtime
Definition: metaengine.h:114
Definition: metaengine.h:463
Definition: metaengine.h:408
SeekableReadStream InSaveFile
Definition: savefile.h:47
byte groupId
Definition: metaengine.h:74
Graphics::Surface * thumbnail
Definition: metaengine.h:115
uint32 date
Definition: metaengine.h:112
Definition: achievements.h:74
Definition: system.h:167
Definition: metaengine.h:107
virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const
Definition: metaengine.h:231
Common::String description
Definition: metaengine.h:111
virtual int getGameVariantCount() const
Definition: metaengine.h:169
Definition: engine.h:143
const char * tooltip
Definition: metaengine.h:71
Definition: singleton.h:42