362 lines
9.5 KiB
C
Raw Normal View History

2009-05-26 14:13:08 +00:00
/* Residual - A 3D game interpreter
*
* Residual 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 library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library 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
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
* $URL$
* $Id$
*
*/
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"
#include "engines/grim/textobject.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;
2003-08-15 18:00:22 +00:00
2009-06-18 11:52:26 +00:00
enum enDebugLevels {
DEBUG_NONE, DEBUG_NORMAL, DEBUG_WARN, DEBUG_ERROR, DEBUG_LUA, DEBUG_BITMAPS, DEBUG_MODEL, DEBUG_STUB,
DEBUG_SMUSH, DEBUG_IMUSE, DEBUG_CHORES, DEBUG_ALL
};
#define ENGINE_MODE_IDLE 0
#define ENGINE_MODE_PAUSE 1
#define ENGINE_MODE_NORMAL 2
#define ENGINE_MODE_SMUSH 3
#define ENGINE_MODE_DRAW 4
enum GrimGameType {
GType_GRIM,
GType_MONKEY4
};
enum GrimGameFeatures {
GF_DEMO = 1 << 0
};
struct GrimGameDescription;
2005-08-27 16:08:44 +00:00
typedef Common::HashMap<Common::String, const char *> StringPtrHashMap;
2005-08-27 16:08:44 +00:00
#define GF_DEMO 1
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();
2003-08-15 18:00:22 +00:00
public:
GrimEngine(OSystem *syst, int gameFlags, GrimGameType gameType);
virtual ~GrimEngine();
int getGameFlags() { return _gameFlags; }
GrimGameType getGameType() { return _gameType; }
bool loadSaveDirectory(void);
void makeSystemMenu(void);
int modifyGameSpeed(int speedChange);
int getTimerDelay() const;
void setMode(int mode) { _mode = mode; }
int getMode() { return _mode; }
2005-08-13 13:35:43 +00:00
void setPreviousMode(int mode) { _previousMode = mode; }
int getPreviousMode() { return _previousMode; }
2004-03-20 08:22:51 +00:00
void setSpeechMode(int mode) { _speechMode = mode; }
int 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; }
void refreshDrawMode() { _refreshDrawNeeded = true; }
2005-08-14 13:26:37 +00:00
void drawPrimitives();
void mainLoop();
2004-12-09 23:55:43 +00:00
unsigned frameStart() const { return _frameStart; }
unsigned frameTime() 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
float perSecond(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);
Scene *findScene(const char *name);
void setSceneLock(const char *name, bool lockStatus);
void setScene(const char *name);
void setScene(Scene *scene);
2004-12-09 23:55:43 +00:00
Scene *currScene() { return _currScene; }
const char *sceneName() const { return _currScene->name(); }
void makeCurrentSetup(int num);
// Scene registration
typedef Common::HashMap<int, Scene *> SceneListType;
SceneListType::const_iterator scenesBegin() const {
return _scenes.begin();
}
SceneListType::const_iterator scenesEnd() const {
return _scenes.end();
}
void registerScene(Scene *a);
void removeScene(Scene *a);
void killScenes();
int sceneId(Scene *s) const;
void flagRefreshShadowMask(bool flag) {
_refreshShadowMask = flag;
}
bool getFlagRefreshShadowMask() {
return _refreshShadowMask;
}
2009-06-26 16:13:11 +00:00
Bitmap *registerBitmap(const char *filename, const char *data, int len) {
Bitmap *b = new Bitmap(filename, data, len);
_bitmaps.push_back(b);
return b;
}
Bitmap *registerBitmap(const char *data, int width, int height, const char *filename) {
Bitmap *b = new Bitmap(data, width, height, filename);
_bitmaps.push_back(b);
return b;
}
void registerBitmap(Bitmap *bitmap) {
_bitmaps.push_back(bitmap);
}
2009-06-26 16:13:11 +00:00
void killBitmap(Bitmap *b) { _bitmaps.remove(b); }
// Actor registration
typedef Common::HashMap<int, Actor *> ActorListType;
2004-12-10 07:26:03 +00:00
ActorListType::const_iterator actorsBegin() const {
2004-12-09 23:55:43 +00:00
return _actors.begin();
}
2004-12-10 07:26:03 +00:00
ActorListType::const_iterator actorsEnd() const {
2004-12-09 23:55:43 +00:00
return _actors.end();
}
void registerActor(Actor *a);
void killActor(Actor *a);
int actorId(Actor *a) const;
Actor *actor(int id) const;
2004-12-09 23:55:43 +00:00
void setSelectedActor(Actor *a) { _selectedActor = a; }
Actor *selectedActor() { return _selectedActor; }
2011-03-21 17:18:04 +01:00
void killActors();
2011-03-21 17:18:04 +01:00
// Text Object Registration
typedef Common::HashMap<int, TextObject *> TextListType;
2004-12-10 07:26:03 +00:00
TextListType::const_iterator textsBegin() const {
2004-12-09 23:55:43 +00:00
return _textObjects.begin();
}
2004-12-10 07:26:03 +00:00
TextListType::const_iterator textsEnd() const {
2004-12-09 23:55:43 +00:00
return _textObjects.end();
}
void registerTextObject(TextObject *a);
void killTextObject(TextObject *a);
void killTextObjects();
int textObjectId(TextObject *t) const;
TextObject *textObject(int id) const;
2005-04-07 19:29:06 +00:00
// Primitives Object Registration
typedef Common::HashMap<int, PrimitiveObject *> PrimitiveListType;
2005-04-07 19:29:06 +00:00
PrimitiveListType::const_iterator primitivesBegin() const {
return _primitiveObjects.begin();
}
PrimitiveListType::const_iterator primitivesEnd() const {
return _primitiveObjects.end();
}
void registerPrimitiveObject(PrimitiveObject *a);
void killPrimitiveObject(PrimitiveObject *a);
void killPrimitiveObjects();
int primitiveObjectId(PrimitiveObject *p) const;
PrimitiveObject *primitiveObject(int id) const;
2005-04-07 19:29:06 +00:00
void registerObjectState(ObjectState *o);
void killObjectState(ObjectState *o);
void killObjectStates();
int objectStateId(ObjectState *o) const;
ObjectState *objectState(int id) const;
2009-06-22 21:06:46 +00:00
2004-11-01 16:36:41 +00:00
void savegameSave();
2009-06-22 14:11:40 +00:00
void saveActors(SaveGame *savedState);
2009-06-23 05:15:20 +00:00
void saveTextObjects(SaveGame *savedState);
void savePrimitives(SaveGame *savedState);
2009-06-24 17:30:34 +00:00
void saveScenes(SaveGame *savedState);
void saveObjectStates(SaveGame *savedState);
void savegameRestore();
void restoreActors(SaveGame *savedState);
void restoreTextObjects(SaveGame *savedState);
void restorePrimitives(SaveGame *savedState);
void restoreScenes(SaveGame *savedState);
void restoreObjectStates(SaveGame *savedState);
2009-06-22 21:20:12 +00:00
2005-01-12 23:28:47 +00:00
void savegameCallback();
static void savegameReadStream(void *data, int32 size);
static void savegameWriteStream(void *data, int32 size);
static int32 savegameReadSint32();
static void savegameWriteSint32(int32 val);
static uint32 savegameReadUint32();
static void savegameWriteUint32(uint32 val);
void storeSaveGameImage(SaveGame *savedState);
2004-11-01 09:47:19 +00:00
bool _savegameLoadRequest;
bool _savegameSaveRequest;
const char *_savegameFileName;
SaveGame *_savedState;
2004-11-01 09:47:19 +00:00
Common::StringArray _listFiles;
Common::StringArray::const_iterator _listFilesIter;
TextObjectDefaults _sayLineDefaults;
TextObjectDefaults _printLineDefaults;
TextObjectDefaults _blastTextDefaults;
private:
2003-08-15 18:00:22 +00:00
2009-05-31 16:09:21 +00:00
void handleControls(int operation, int key, int keyModifier, uint16 ascii);
void handleChars(int operation, int key, int keyModifier, uint16 ascii);
void handleUserPaint();
void handleExit();
void handlePause();
2004-12-09 23:55:43 +00:00
Scene *_currScene;
2005-08-13 13:35:43 +00:00
int _mode, _previousMode;
2004-03-20 08:22:51 +00:00
int _speechMode;
2005-04-08 11:47:47 +00:00
int _textSpeed;
2005-08-13 16:25:51 +00:00
bool _flipEnable;
bool _refreshDrawNeeded;
2005-08-28 23:25:14 +00:00
char _fps[8];
bool _doFlip;
bool _refreshShadowMask;
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
unsigned int _frameTimeCollection;
int _prevSmushFrame;
unsigned int _frameCounter;
unsigned int _timeAccum;
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;
2003-08-15 18:00:22 +00:00
SceneListType _scenes;
2004-12-10 07:26:03 +00:00
ActorListType _actors;
2004-12-09 23:55:43 +00:00
Actor *_selectedActor;
2004-12-10 07:26:03 +00:00
TextListType _textObjects;
2005-04-07 19:29:06 +00:00
PrimitiveListType _primitiveObjects;
2009-06-26 16:13:11 +00:00
Common::List<Bitmap *> _bitmaps;
Common::HashMap<int, ObjectState *> _objectStates;
int _gameFlags;
GrimGameType _gameType;
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;
extern Actor *g_currentUpdatedActor;
2005-01-01 10:12:16 +00:00
void vimaInit(uint16 *destTable);
void decompressVima(const byte *src, int16 *dest, int destLen, uint16 *destTable);
2008-08-17 12:01:26 +00:00
// Fake KEYCODE_* values for joystick and mouse events
enum {
KEYCODE_JOY1_B1 = 512,
KEYCODE_JOY1_B2,
KEYCODE_JOY1_B3,
KEYCODE_JOY1_B4,
KEYCODE_JOY1_B5,
KEYCODE_JOY1_B6,
KEYCODE_JOY1_B7,
KEYCODE_JOY1_B8,
KEYCODE_JOY1_B9,
KEYCODE_JOY1_B10,
KEYCODE_JOY1_HLEFT,
KEYCODE_JOY1_HUP,
KEYCODE_JOY1_HRIGHT,
KEYCODE_JOY1_HDOWN,
KEYCODE_JOY2_B1,
KEYCODE_JOY2_B2,
KEYCODE_JOY2_B3,
KEYCODE_JOY2_B4,
KEYCODE_JOY2_B5,
KEYCODE_JOY2_B6,
KEYCODE_JOY2_B7,
KEYCODE_JOY2_B8,
KEYCODE_JOY2_B9,
KEYCODE_JOY2_B10,
KEYCODE_JOY2_HLEFT,
KEYCODE_JOY2_HUP,
KEYCODE_JOY2_HRIGHT,
KEYCODE_JOY2_HDOWN,
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
};
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