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 #include "common/debug-channels.h"
29 
30 #include "engines/achievements.h"
31 #include "engines/game.h"
32 #include "engines/savestate.h"
33 
34 #include "base/plugins.h"
35 
36 class Engine;
37 class OSystem;
38 
39 namespace Common {
40 class Keymap;
41 class FSList;
42 class OutSaveFile;
43 class String;
44 
45 typedef SeekableReadStream InSaveFile;
46 }
47 
48 namespace Graphics {
49 struct Surface;
50 }
51 
52 namespace GUI {
53 class GuiObject;
54 class OptionsContainerWidget;
55 }
56 
71  const char *label;
72  const char *tooltip;
73  const char *configOption;
74  bool defaultState;
75  byte groupId;
77 };
78 
83 
87 enum { kSavegameFilePattern = -99 };
88 
89 #define EXTENDED_SAVE_VERSION 4
90 
95  char id[6];
96  uint8 version;
99  uint32 date;
100  uint16 time;
101  uint32 playtime;
103  bool isAutosave;
106  memset(id, 0, 6);
107  version = 0;
108  date = 0;
109  time = 0;
110  playtime = 0;
111  thumbnail = nullptr;
112  isAutosave = false;
113  }
114 };
115 
127 protected:
131  static Common::String escapeString(const char *string);
132 
133 public:
138  static const char GAME_NOT_IMPLEMENTED[];
139 
140  virtual ~MetaEngineDetection() {}
141 
143  virtual const char *getName() const override = 0;
144 
146  virtual const char *getEngineName() const = 0;
147 
149  virtual const char *getOriginalCopyright() const = 0;
150 
152  virtual PlainGameList getSupportedGames() const = 0;
153 
155  virtual PlainGameDescriptor findGame(const char *gameId) const = 0;
156 
158  virtual Common::Error identifyGame(DetectedGame &game, const void **descriptor) = 0;
159 
165  virtual DetectedGames detectGames(const Common::FSList &fslist, uint32 skipADFlags = 0, bool skipIncomplete = false) = 0;
166 
168  virtual uint getMD5Bytes() const = 0;
169 
171  virtual int getGameVariantCount() const {
172  return -1;
173  }
174 
176  virtual void dumpDetectionEntries() const = 0;
177 
185  virtual const DebugChannelDef *getDebugChannels() const {
186  return NULL;
187  }
188 };
189 
202 class MetaEngine : public PluginObject {
203 protected:
209  virtual void getSavegameThumbnail(Graphics::Surface &thumb);
210 
217  int findEmptySaveSlot(const char *target);
218 
233  virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const {
234  return ExtraGuiOptions();
235  }
236 
237 public:
238  virtual ~MetaEngine() {}
239 
250  virtual const char *getName() const override = 0;
251 
268  virtual Common::Error createInstance(OSystem *syst, Engine **engine, const DetectedGame &gameDescriptor, const void *meDescriptor) = 0;
269 
282  virtual void deleteInstance(Engine *engine, const DetectedGame &gameDescriptor, const void *meDescriptor);
283 
303  virtual SaveStateList listSaves(const char *target) const;
304 
315  SaveStateList listSaves(const char *target, bool saveMode) const;
316 
323  virtual int getAutosaveSlot() const {
324  return 0;
325  }
326 
337  virtual int getMaximumSaveSlot() const {
338  // For games using the new save format, assume 99 slots by default
339  return hasFeature(kSavesUseExtendedFormat) ? 99 : 0;
340  }
341 
354  virtual bool removeSaveState(const char *target, int slot) const;
355 
365  virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
366 
375  virtual Common::String getSavegameFile(int saveGameIdx, const char *target = nullptr) const;
376 
382  Common::String getSavegameFilePattern(const char *target = nullptr) const {
383  return getSavegameFile(kSavegameFilePattern, target);
384  }
385 
389  virtual Common::Array<Common::Keymap *> initKeymaps(const char *target) const;
390 
397  virtual void registerDefaultSettings(const Common::String &target) const;
398 
411  virtual GUI::OptionsContainerWidget *buildEngineOptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const;
412 
428 
433 
440 
456 
465 
474 
483 
501 
512  kSavesUseExtendedFormat
513  };
514 
522  virtual Common::AchievementsPlatform getAchievementsPlatform(const Common::String &target) const;
523 
531  virtual const Common::AchievementsInfo getAchievementsInfo(const Common::String &target) const;
532 
541  return nullptr;
542  }
543 
549  virtual bool hasFeature(MetaEngineFeature f) const;
550 
554  void appendExtendedSave(Common::OutSaveFile *saveFile, uint32 playtime, Common::String desc, bool isAutosave);
555 
559  void appendExtendedSaveToStream(Common::WriteStream *saveFile, uint32 playtime, Common::String desc, bool isAutosave, uint32 offset = 0);
560 
568  bool copySaveFileToFreeSlot(const char *target, int slot);
569 
573  static void parseSavegameHeader(ExtendedSavegameHeader *header, SaveStateDescriptor *desc);
579  static void fillDummyHeader(ExtendedSavegameHeader *header);
580 
584  static void decodeSavegameDate(const ExtendedSavegameHeader *header, uint16 &outYear, uint8 &outMonth, uint8 &outDay);
585 
589  static void decodeSavegameTime(const ExtendedSavegameHeader *header, uint8 &outHour, uint8 &outMinute);
590 
594  WARN_UNUSED_RESULT static bool readSavegameHeader(Common::InSaveFile *in, ExtendedSavegameHeader *header, bool skipThumbnail = true);
595 };
596 
600 class EngineManager : public Common::Singleton<EngineManager> {
601 public:
608  DetectionResults detectGames(const Common::FSList &fslist, uint32 skipADFlags = 0, bool skipIncomplete = false);
609 
611  const Plugin *findDetectionPlugin(const Common::String &engineId) const;
612 
616  const PluginList &getPlugins(const PluginType fetchPluginType) const;
617 
619  QualifiedGameDescriptor findTarget(const Common::String &target) const;
620 
628  QualifiedGameList findGamesMatching(const Common::String &engineId, const Common::String &gameId) const;
629 
635  Common::String createTargetForGame(const DetectedGame &game);
636 
638  void upgradeTargetIfNecessary(const Common::String &target) const;
639 
641  Common::String generateUniqueDomain(const Common::String &gameId);
642 
643 private:
645  QualifiedGameList findGameInLoadedPlugins(const Common::String &gameId) const;
646 
648  void upgradeTargetForEngineId(const Common::String &target) const;
649 };
650 
652 #define EngineMan EngineManager::instance()
653 
654 #endif
virtual int getAutosaveSlot() const
Definition: metaengine.h:323
bool isAutosave
Definition: metaengine.h:103
Definition: game.h:79
Definition: metaengine.h:202
Definition: str.h:59
Definition: metaengine.h:500
Definition: surface.h:67
uint8 version
Definition: metaengine.h:96
MetaEngineFeature
Definition: metaengine.h:419
Definition: stream.h:77
Definition: savefile.h:54
Definition: error.h:81
Definition: metaengine.h:432
Definition: game.h:146
Common::String getSavegameFilePattern(const char *target=nullptr) const
Definition: metaengine.h:382
virtual int getMaximumSaveSlot() const
Definition: metaengine.h:337
Definition: metaengine.h:600
Definition: achievements.h:87
const char * label
Definition: metaengine.h:71
Definition: metaengine.h:464
Definition: game.h:64
byte groupLeaderId
Definition: metaengine.h:76
bool defaultState
Definition: metaengine.h:74
Definition: stream.h:745
Common::Array< ExtraGuiOption > ExtraGuiOptions
Definition: metaengine.h:82
Definition: system.h:46
Definition: game.h:49
Definition: object.h:60
Definition: plugins.h:145
Definition: widget.h:533
void upgradeTargetIfNecessary(const ObsoleteGameID *obsoleteList)
Definition: savestate.h:56
Definition: metaengine.h:70
Definition: metaengine.h:439
virtual const Common::AchievementDescriptionList * getAchievementDescriptionList() const
Definition: metaengine.h:540
Definition: game.h:249
virtual const DebugChannelDef * getDebugChannels() const
Definition: metaengine.h:185
Definition: debug-channels.h:36
Definition: algorithm.h:29
Definition: formatinfo.h:28
Definition: metaengine.h:473
Definition: metaengine.h:455
bool skipThumbnail(Common::SeekableReadStream &in)
const char * configOption
Definition: metaengine.h:73
AchievementsPlatform
Definition: achievements.h:46
Definition: plugins.h:131
Definition: metaengine.h:126
Definition: fs.h:57
uint16 time
Definition: metaengine.h:100
Common::String saveName
Definition: metaengine.h:97
uint32 playtime
Definition: metaengine.h:101
Definition: metaengine.h:482
Definition: metaengine.h:427
SeekableReadStream InSaveFile
Definition: savefile.h:47
byte groupId
Definition: metaengine.h:75
Graphics::Surface * thumbnail
Definition: metaengine.h:102
uint32 date
Definition: metaengine.h:99
Definition: achievements.h:74
Definition: system.h:163
Definition: metaengine.h:94
virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const
Definition: metaengine.h:233
Common::String description
Definition: metaengine.h:98
virtual int getGameVariantCount() const
Definition: metaengine.h:171
Definition: engine.h:146
const char * tooltip
Definition: metaengine.h:72
Definition: singleton.h:42