2021-03-25 20:52:28 +01:00

194 lines
5.7 KiB
C++

/* 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 BURIED_BURIED_H
#define BURIED_BURIED_H
#include "common/scummsys.h"
#include "common/array.h"
#include "common/list.h"
#include "common/hashmap.h"
#include "common/str-array.h"
#include "engines/engine.h"
class OSystem;
struct ADGameDescription;
namespace Common {
class SeekableReadStream;
class Serializer;
class WinResources;
class WriteStream;
}
namespace Graphics {
struct WinCursorGroup;
}
namespace Buried {
enum {
GF_TRUECOLOR = (1 << 1),
GF_WIN95 = (1 << 2),
GF_COMPRESSED = (1 << 3),
GF_TRIAL = (1 << 4)
};
class BuriedConsole;
struct GlobalFlags;
class GraphicsManager;
struct Location;
class Message;
class SoundManager;
class Window;
class VideoWindow;
class BuriedEngine : public ::Engine {
protected:
Common::Error run();
public:
BuriedEngine(OSystem *syst, const ADGameDescription *gamedesc);
virtual ~BuriedEngine();
// Detection related functions
const ADGameDescription *_gameDescription;
bool isDemo() const;
bool isTrial() const;
bool isTrueColor() const;
bool isWin95() const;
bool isCompressed() const;
Common::String getEXEName() const;
Common::String getLibraryName() const;
Common::Language getLanguage() const;
bool hasFeature(EngineFeature f) const;
void pauseEngineIntern(bool pause);
// Resources
Common::String getString(uint32 stringID);
Common::String getFilePath(uint32 stringID);
Common::String getFilePath(int timeZone, int environment, int fileOffset);
Graphics::WinCursorGroup *getCursorGroup(uint32 cursorGroupID);
Common::SeekableReadStream *getBitmapStream(uint32 bitmapID);
Common::SeekableReadStream *getNavData(uint32 resourceID);
Common::SeekableReadStream *getSndData(uint32 resourceID);
Common::SeekableReadStream *getAnimData(uint32 resourceID);
Common::SeekableReadStream *getAIData(uint32 resourceID);
Common::SeekableReadStream *getItemData(uint32 resourceID);
Common::SeekableReadStream *getBookData(uint32 resourceID);
Common::SeekableReadStream *getFileBCData(uint32 resourceID);
Common::SeekableReadStream *getINNData(uint32 resourceID);
uint32 getVersion();
uint32 computeNavDBResourceID(int timeZone, int environment);
uint32 computeAnimDBResourceID(int timeZone, int environment);
uint32 computeAIDBResourceID(int timeZone, int environment);
uint32 computeFileNameResourceID(int timeZone, int environment, int fileOffset);
GraphicsManager *_gfx;
SoundManager *_sound;
Window *_mainWindow; // Only one main window is supported.
Window *_focusedWindow;
Window *_captureWindow;
// Timers
uint createTimer(Window *window, uint period);
bool killTimer(uint timer);
void removeAllTimers(Window *window);
// Video
void addVideo(VideoWindow *window);
void removeVideo(VideoWindow *window);
void updateVideos();
// Messaging
void postMessageToWindow(Window *dest, Message *message);
void sendAllMessages();
void removeKeyboardMessages(Window *window);
void removeMouseMessages(Window *window);
void removeAllMessages(Window *window);
void removeMessages(Window *window, int messageBegin, int messageEnd);
bool hasMessage(Window *window, int messageBegin, int messageEnd) const;
// Miscellaneous
void yield();
int getTransitionSpeed();
void setTransitionSpeed(int newSpeed);
void releaseCapture() { _captureWindow = 0; }
bool runQuitDialog();
bool isControlDown() const;
// Save/Load
bool canLoadGameStateCurrently();
bool canSaveGameStateCurrently();
Common::Error loadGameState(int slot);
Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave);
static Common::StringArray listSaveFiles();
bool loadState(Common::SeekableReadStream *saveFile, Location &location, GlobalFlags &flags, Common::Array<int> &inventoryItems);
bool saveState(Common::WriteStream *saveFile, Location &location, GlobalFlags &flags, Common::Array<int> &inventoryItems);
Common::Error runSaveDialog();
Common::Error runLoadDialog();
private:
Common::WinResources *_mainEXE, *_library;
struct Timer {
Window *owner;
uint32 period;
uint32 nextTrigger;
};
typedef Common::HashMap<uint, Timer> TimerMap;
TimerMap _timers;
uint _timerSeed;
uint32 _pauseStartTime;
typedef Common::List<VideoWindow *> VideoList;
VideoList _videos;
bool _yielding;
struct MessageInfo { // I did think about calling this "Envelope"
Window *dest;
Message *message;
};
// LordHoto didn't want me to add an iterator to Common::Queue.
typedef Common::List<MessageInfo> MessageQueue;
MessageQueue _messageQueue;
void pollForEvents();
// Saves
bool syncLocation(Common::Serializer &s, Location &location);
bool syncGlobalFlags(Common::Serializer &s, GlobalFlags &flags);
};
// Macro for creating a version field
#define MAKEVERSION(a, b, c, d) \
(((uint32)((a) & 0xFF) << 24) | ((uint32)((b) & 0xFF) << 16) | ((uint32)((c) & 0xFF) << 8) | ((uint32)((d) & 0xFF)))
} // End of namespace Buried
#endif