1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
|
/* 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 CRYOMNI3D_CRYOMNI3D_H
#define CRYOMNI3D_CRYOMNI3D_H
#include "audio/mixer.h"
#include "common/array.h"
#include "common/keyboard.h"
#include "common/queue.h"
#include "common/rect.h"
#include "common/scummsys.h"
#include "engines/engine.h"
#include "graphics/cursorman.h"
#include "cryomni3d/font_manager.h"
#include "cryomni3d/objects.h"
#include "cryomni3d/sprites.h"
class OSystem;
namespace Common {
struct Point;
class SeekableReadStream;
}
namespace Image {
class ImageDecoder;
}
/**
* This is the namespace of the Cryo Omni3D engine.
*
* Status of this engine: ???
*
* Games using this engine:
* - Versailles
* - ...
*/
namespace CryOmni3D {
class DATSeekableStream;
enum CryOmni3DGameType {
GType_VERSAILLES
};
enum CryOmni3DGameFeatures {
GF_VERSAILLES_FONTS_MASK = (3 << 0), // Fonts flag mask
GF_VERSAILLES_FONTS_NUMERIC = (0 << 0), // Fonts are font01.crf, ...
GF_VERSAILLES_FONTS_SET_A = (1 << 0), // Fonts are for French Macintosh (development version)
GF_VERSAILLES_FONTS_SET_B = (2 << 0), // Standard set (Helvet12 is used for debugging docs)
GF_VERSAILLES_FONTS_SET_C = (3 << 0), // Fonts for Italian version (Helvet12 is used for docs texts)
GF_VERSAILLES_AUDIOPADDING_NO = (0 << 2), // Audio files have underscore padding before extension
GF_VERSAILLES_AUDIOPADDING_YES = (1 << 2), // Audio files have underscore padding before extension
GF_VERSAILLES_LINK_STANDARD = (0 << 3), // Links file is lien_doc.txt
GF_VERSAILLES_LINK_LOCALIZED = (1 << 3) // Links file is taken from cryomni3d.dat
};
struct CryOmni3DGameDescription;
// Engine Debug Flags
enum {
kDebugFile = (1 << 0),
kDebugVariable = (1 << 1),
kDebugSaveLoad = (1 << 2)
};
enum DragStatus {
kDragStatus_NoDrag = 0,
kDragStatus_Pressed,
kDragStatus_Finished,
kDragStatus_Dragging
};
class CryOmni3DEngine : public ::Engine {
protected:
Common::Error run() override;
public:
CryOmni3DEngine(OSystem *syst, const CryOmni3DGameDescription *gamedesc);
~CryOmni3DEngine() override;
// Detection related functions
const CryOmni3DGameDescription *_gameDescription;
const char *getGameId() const;
uint32 getFeatures() const;
uint16 getVersion() const;
Common::Platform getPlatform() const;
uint8 getGameType() const;
Common::Language getLanguage() const;
bool hasFeature(EngineFeature f) const override;
bool canLoadGameStateCurrently() override { return _canLoadSave; }
bool canSaveGameStateCurrently() override { return _canLoadSave; }
void setCanLoadSave(bool canLoadSave) { _canLoadSave = canLoadSave; }
static const uint kSaveDescriptionLen = 20;
private:
void pauseEngineIntern(bool) override;
public:
Image::ImageDecoder *loadHLZ(const Common::String &filename);
void fillSurface(byte color);
/* We use CursorMan because it avoids problems with cursors in GMM */
void setCursor(const Graphics::Cursor &cursor) const;
void setCursor(uint cursorId) const;
bool showMouse(bool visible) { return CursorMan.showMouse(visible); }
typedef void (CryOmni3DEngine::*HNMCallback)(uint frameNum);
void playHNM(const Common::String &filename,
Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType,
HNMCallback beforeDraw = nullptr, HNMCallback afterDraw = nullptr);
bool displayHLZ(const Common::String &filename, uint32 timeout = uint(-1));
bool pollEvents();
Common::Point getMousePos();
void setMousePos(const Common::Point &point);
uint getCurrentMouseButton() { return _lastMouseButton; }
Common::KeyState getNextKey();
bool checkKeysPressed();
bool checkKeysPressed(uint numKeys, ...);
void clearKeys() { _keysPressed.clear(); }
void waitMouseRelease();
void setAutoRepeatClick(uint millis);
DragStatus getDragStatus() { return _dragStatus; }
Common::String prepareFileName(const Common::String &baseName, const char *extension) const {
const char *const extensions[] = { extension, nullptr };
return prepareFileName(baseName, extensions);
}
virtual Common::String prepareFileName(const Common::String &baseName,
const char *const *extensions) const;
virtual bool displayToolbar(const Graphics::Surface *original) = 0;
virtual bool hasPlaceDocumentation() = 0;
virtual bool displayPlaceDocumentation() = 0;
virtual uint displayOptions() = 0;
virtual bool shouldAbort() { return g_engine->shouldQuit(); }
virtual void makeTranslucent(Graphics::Surface &dst, const Graphics::Surface &src) const = 0;
virtual void setupPalette(const byte *colors, uint start, uint num) = 0;
protected:
DATSeekableStream *getStaticData(uint32 gameId, uint16 version) const;
void copySubPalette(byte *dst, const byte *src, uint start, uint num);
void setPalette(const byte *colors, uint start, uint num);
void lockPalette(uint startRW, uint endRW) { _lockPaletteStartRW = startRW; _lockPaletteEndRW = endRW; }
void unlockPalette() { _lockPaletteStartRW = 0; _lockPaletteEndRW = 255; }
void fadeOutPalette();
void fadeInPalette(const byte *colors);
void setBlackPalette();
void setHNMClipping(const Common::Rect &clip) { _hnmClipping = clip; _hnmHasClip = true; }
void unsetHNMClipping() { _hnmHasClip = false; }
protected:
bool _canLoadSave;
FontManager _fontManager;
Sprites _sprites;
Objects _objects;
Inventory _inventory;
Common::Queue<Common::KeyState> _keysPressed;
DragStatus _dragStatus;
Common::Point _dragStart;
uint _lastMouseButton;
uint _autoRepeatNextEvent;
private:
uint _lockPaletteStartRW;
uint _lockPaletteEndRW;
Common::Rect _hnmClipping;
bool _hnmHasClip;
};
} // End of namespace CryOmni3D
#endif
|