332 lines
8.7 KiB
C
Raw Normal View History

2012-01-06 23:29:45 +01:00
/* ResidualVM - A 3D game interpreter
*
2012-01-06 23:29:45 +01:00
* ResidualVM is the legal property of its developers, whose names
2011-04-16 14:12:44 +02:00
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
2006-04-02 14:20:45 +00:00
*
* 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.
2014-04-05 18:18:42 +02:00
*
* This program is distributed in the hope that it will be useful,
2006-04-02 14:20:45 +00:00
* 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.
2014-04-05 18:18:42 +02:00
*
* 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.
2006-04-02 14:20:45 +00:00
*
*/
2003-08-15 18:00:22 +00:00
2009-05-26 09:39:42 +00:00
#ifndef GRIM_ENGINE_H
#define GRIM_ENGINE_H
2003-08-15 18:00:22 +00:00
#include "engines/engine.h"
2011-05-13 17:55:14 -07:00
#include "common/str-array.h"
#include "common/hashmap.h"
#include "common/events.h"
2011-05-13 17:55:14 -07:00
#include "engines/advancedDetector.h"
#include "engines/grim/textobject.h"
2011-07-17 18:17:07 +02:00
#include "engines/grim/iris.h"
#include "engines/grim/detection.h"
2003-08-15 18:00:22 +00:00
2009-05-25 06:49:57 +00:00
namespace Grim {
2003-08-15 18:00:22 +00:00
class Actor;
2009-05-09 17:44:05 +00:00
class SaveGame;
2011-05-13 17:55:14 -07:00
class Bitmap;
class Font;
class Color;
class ObjectState;
class Set;
2011-05-13 17:55:14 -07:00
class TextObject;
class PrimitiveObject;
class LuaBase;
class GfxBase;
2003-08-15 18:00:22 +00:00
2008-08-17 12:01:26 +00:00
struct ControlDescriptor {
const char *name;
int key;
};
class GrimEngine : public Engine {
protected:
// Engine APIs
virtual Common::Error run() override;
2003-08-15 18:00:22 +00:00
public:
enum EngineMode {
PauseMode = 1,
NormalMode = 2,
SmushMode = 3,
DrawMode = 4,
OverworldMode = 5
};
2011-05-23 17:06:16 +02:00
enum SpeechMode {
TextOnly = 1,
VoiceOnly = 2,
TextAndVoice = 3
};
GrimEngine(OSystem *syst, uint32 gameFlags, GrimGameType gameType, Common::Platform platform, Common::Language language);
virtual ~GrimEngine();
void clearPools();
int getGameFlags() { return _gameFlags; }
GrimGameType getGameType() { return _gameType; }
Common::Language getGameLanguage() { return _gameLanguage; }
2012-01-14 12:52:54 +01:00
Common::Platform getGamePlatform() { return _gamePlatform; }
virtual const char *getUpdateFilename();
bool canLoadGameStateCurrently() override { return true; }
Common::Error loadGameState(int slot) override;
void setMode(EngineMode mode);
EngineMode getMode() { return _mode; }
void setPreviousMode(EngineMode mode) { _previousMode = mode; }
EngineMode getPreviousMode() { return _previousMode; }
2011-05-23 17:06:16 +02:00
void setSpeechMode(SpeechMode mode) { _speechMode = mode; }
SpeechMode getSpeechMode() { return _speechMode; }
SaveGame *savedState() { return _savedState; }
2005-08-13 13:35:43 +00:00
void handleDebugLoadResource();
void luaUpdate();
void updateDisplayScene();
2005-08-28 23:25:14 +00:00
void doFlip();
2005-08-13 16:25:51 +00:00
void setFlipEnable(bool state) { _flipEnable = state; }
bool getFlipEnable() { return _flipEnable; }
virtual void drawTextObjects();
2011-07-17 18:17:07 +02:00
void playIrisAnimation(Iris::Direction dir, int x, int y, int time);
void mainLoop();
2011-05-05 11:25:08 +02:00
unsigned getFrameStart() const { return _frameStart; }
unsigned getFrameTime() const { return _frameTime; }
// perSecond should allow rates of zero, some actors will accelerate
// up to their normal speed (such as the bone wagon) so handling
// a walking rate of zero should happen in the default actor creation
2011-05-05 11:25:08 +02:00
float getPerSecond(float rate) const;
2005-04-08 11:47:47 +00:00
int getTextSpeed() { return _textSpeed; }
void setTextSpeed(int speed);
2004-12-09 23:55:43 +00:00
void enableControl(int num) { _controlsEnabled[num] = true; }
void disableControl(int num) { _controlsEnabled[num] = false; }
2008-08-17 12:01:26 +00:00
float getControlAxis(int num);
bool getControlState(int num);
void clearEventQueue();
Set *findSet(const Common::String &name);
void setSetLock(const char *name, bool lockStatus);
Set *loadSet(const Common::String &name);
void setSet(const char *name);
void setSet(Set *scene);
Set *getCurrSet() { return _currSet; }
void makeCurrentSetup(int num);
2011-05-05 11:32:11 +02:00
void flagRefreshShadowMask(bool flag) { _refreshShadowMask = flag; }
bool getFlagRefreshShadowMask() { return _refreshShadowMask; }
2004-12-09 23:55:43 +00:00
void setSelectedActor(Actor *a) { _selectedActor = a; }
2011-05-05 11:25:08 +02:00
Actor *getSelectedActor() { return _selectedActor; }
/**
* Tell the engine that an actor has been moved into/outside a set,
* and so that it should rebuild the list of active ones.
*/
virtual void invalidateActiveActorsList();
virtual void invalidateTextObjectsSortOrder() {};
/**
* Return a list of the currently active actors, i. e. the actors in the current set.
*/
const Common::List<Actor *> &getActiveActors() const { return _activeActors; }
/**
* Add an actor to the list of actors that are talking
*/
void addTalkingActor(Actor *actor);
inline const Common::List<Actor *> &getTalkingActors() const { return _talkingActors; }
bool areActorsTalking() const;
void immediatelyRemoveActor(Actor *actor);
void drawMovieSubtitle();
void setMovieSubtitle(TextObject *to);
void setMovieSetup();
void saveGame(const Common::String &file);
void loadGame(const Common::String &file);
void changeHardwareState();
// Engine APIs
bool hasFeature(EngineFeature f) const override;
Common::StringArray _listFiles;
Common::StringArray::const_iterator _listFilesIter;
TextObjectDefaults _sayLineDefaults, _printLineDefaults, _blastTextDefaults;
2013-07-10 20:43:55 +02:00
void debugLua(const Common::String &str);
protected:
virtual void pauseEngineIntern(bool pause) override;
void handleControls(Common::EventType type, const Common::KeyState &key);
void handleChars(Common::EventType type, const Common::KeyState &key);
2014-12-31 13:01:21 +01:00
void handleJoyAxis(byte axis, int16 position);
void handleJoyButton(Common::EventType type, byte button);
void handleExit();
void handlePause();
void handleUserPaint();
void cameraChangeHandle(int prev, int next);
void cameraPostChangeHandle(int num);
void buildActiveActorsList();
void savegameCallback();
GfxBase *createRenderer(int screenW, int screenH, bool fullscreen);
void playAspyrLogo();
virtual LuaBase *createLua();
virtual void updateNormalMode();
virtual void updateDrawMode();
virtual void drawNormalMode();
2004-11-01 16:36:41 +00:00
void savegameSave();
2011-05-26 10:24:09 -07:00
void saveGRIM();
void savegameRestore();
2011-05-26 10:24:09 -07:00
void restoreGRIM();
2009-06-22 21:20:12 +00:00
virtual void storeSaveGameImage(SaveGame *savedState);
2004-11-01 09:47:19 +00:00
bool _savegameLoadRequest;
bool _savegameSaveRequest;
Common::String _savegameFileName;
SaveGame *_savedState;
2004-11-01 09:47:19 +00:00
Set *_currSet;
EngineMode _mode, _previousMode;
2011-05-23 17:06:16 +02:00
SpeechMode _speechMode;
2005-04-08 11:47:47 +00:00
int _textSpeed;
2005-08-13 16:25:51 +00:00
bool _flipEnable;
2005-08-28 23:25:14 +00:00
char _fps[8];
bool _doFlip;
bool _refreshShadowMask;
bool _shortFrame;
bool _setupChanged;
// This holds the name of the setup in which the movie must be drawed
Common::String _movieSetup;
2003-08-15 18:00:22 +00:00
2004-12-09 23:55:43 +00:00
unsigned _frameStart, _frameTime, _movieTime;
2005-08-13 13:35:43 +00:00
int _prevSmushFrame;
unsigned int _frameCounter;
2011-06-09 18:36:57 -07:00
unsigned int _lastFrameTime;
unsigned _speedLimitMs;
bool _showFps;
bool _softRenderer;
2003-08-15 18:00:22 +00:00
bool *_controlsEnabled;
2008-08-17 12:01:26 +00:00
bool *_controlsState;
2014-12-31 13:01:21 +01:00
float *_joyAxisPosition;
2003-08-15 18:00:22 +00:00
bool _changeHardwareState;
bool _changeFullscreenState;
Actor *_selectedActor;
2011-07-17 18:17:07 +02:00
Iris *_iris;
TextObject::Ptr _movieSubtitle;
bool _buildActiveActorsList;
Common::List<Actor *> _activeActors;
Common::List<Actor *> _talkingActors;
uint32 _gameFlags;
GrimGameType _gameType;
Common::Platform _gamePlatform;
Common::Language _gameLanguage;
uint32 _pauseStartTime;
2003-08-15 18:00:22 +00:00
};
2009-05-17 08:24:17 +00:00
extern GrimEngine *g_grim;
2005-01-03 16:27:57 +00:00
extern int g_imuseState;
2008-08-17 12:01:26 +00:00
// Fake KEYCODE_* values for joystick and mouse events
enum {
KEYCODE_JOY1_A = 512,
KEYCODE_JOY1_B,
KEYCODE_JOY1_X,
KEYCODE_JOY1_Y,
KEYCODE_JOY1_BACK,
KEYCODE_JOY1_GUIDE,
KEYCODE_JOY1_START,
KEYCODE_JOY1_LEFTSTICK,
KEYCODE_JOY1_RIGHTSTICK,
KEYCODE_JOY1_L1,
KEYCODE_JOY1_R1,
KEYCODE_JOY1_HUP,
KEYCODE_JOY1_HDOWN,
KEYCODE_JOY1_HLEFT,
KEYCODE_JOY1_HRIGHT,
KEYCODE_JOY1_L2,
KEYCODE_JOY1_R2,
KEYCODE_JOY1_B14,
KEYCODE_JOY1_B15,
KEYCODE_JOY1_B16,
KEYCODE_JOY1_B17,
KEYCODE_JOY1_B18,
KEYCODE_JOY1_B19,
KEYCODE_JOY1_B20,
KEYCODE_JOY2_A,
KEYCODE_JOY2_B,
KEYCODE_JOY2_X,
KEYCODE_JOY2_Y,
KEYCODE_JOY2_BACK,
KEYCODE_JOY2_GUIDE,
KEYCODE_JOY2_START,
KEYCODE_JOY2_LEFTSTICK,
KEYCODE_JOY2_RIGHTSTICK,
KEYCODE_JOY2_L1,
KEYCODE_JOY2_R1,
2008-08-17 12:01:26 +00:00
KEYCODE_JOY2_HUP,
KEYCODE_JOY2_HDOWN,
KEYCODE_JOY2_HLEFT,
KEYCODE_JOY2_HRIGHT,
KEYCODE_JOY2_L2,
KEYCODE_JOY2_R2,
2008-08-17 12:01:26 +00:00
KEYCODE_MOUSE_B1,
KEYCODE_MOUSE_B2,
KEYCODE_MOUSE_B3,
KEYCODE_MOUSE_B4,
KEYCODE_AXIS_JOY1_X,
KEYCODE_AXIS_JOY1_Y,
KEYCODE_AXIS_JOY1_Z,
KEYCODE_AXIS_JOY1_R,
KEYCODE_AXIS_JOY1_U,
KEYCODE_AXIS_JOY1_V,
KEYCODE_AXIS_JOY2_X,
KEYCODE_AXIS_JOY2_Y,
KEYCODE_AXIS_JOY2_Z,
KEYCODE_AXIS_JOY2_R,
KEYCODE_AXIS_JOY2_U,
KEYCODE_AXIS_JOY2_V,
KEYCODE_AXIS_MOUSE_X,
KEYCODE_AXIS_MOUSE_Y,
KEYCODE_AXIS_MOUSE_Z,
KEYCODE_EXTRA_LAST
};
2014-12-31 13:01:21 +01:00
#define NUM_JOY_AXES (KEYCODE_AXIS_JOY1_V - KEYCODE_AXIS_JOY1_X + 1)
#define NUM_JOY_BUTTONS (KEYCODE_JOY1_R2 - KEYCODE_JOY1_A + 1)
2014-12-31 13:01:21 +01:00
2008-08-17 12:01:26 +00:00
extern const ControlDescriptor controls[];
2009-05-25 06:49:57 +00:00
} // end of namespace Grim
2003-08-15 18:00:22 +00:00
#endif