aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/gob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/gob.cpp')
-rw-r--r--engines/gob/gob.cpp108
1 files changed, 89 insertions, 19 deletions
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index 4e7aa467b5..fcf98f0355 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -48,6 +48,10 @@
#include "gob/videoplayer.h"
#include "gob/save/saveload.h"
+#include "gob/pregob/pregob.h"
+#include "gob/pregob/onceupon/abracadabra.h"
+#include "gob/pregob/onceupon/babayaga.h"
+
namespace Gob {
#define MAX_TIME_DELTA 100
@@ -115,7 +119,7 @@ GobEngine::GobEngine(OSystem *syst) : Engine(syst), _rnd("gob") {
_vidPlayer = 0; _init = 0; _inter = 0;
_map = 0; _palAnim = 0; _scenery = 0;
_draw = 0; _util = 0; _video = 0;
- _saveLoad = 0;
+ _saveLoad = 0; _preGob = 0;
_pauseStart = 0;
@@ -180,6 +184,10 @@ void GobEngine::validateVideoMode(int16 videoMode) {
error("Video mode 0x%X is not supported", videoMode);
}
+EndiannessMethod GobEngine::getEndiannessMethod() const {
+ return _endiannessMethod;
+}
+
Endianness GobEngine::getEndianness() const {
if ((getPlatform() == Common::kPlatformAmiga) ||
(getPlatform() == Common::kPlatformMacintosh) ||
@@ -233,6 +241,10 @@ bool GobEngine::isDemo() const {
return (isSCNDemo() || isBATDemo());
}
+bool GobEngine::hasResourceSizeWorkaround() const {
+ return _resourceSizeWorkaround;
+}
+
bool GobEngine::isCurrentTot(const Common::String &tot) const {
return _game->_curTotFile.equalsIgnoreCase(tot);
}
@@ -270,15 +282,15 @@ void GobEngine::setTrueColor(bool trueColor) {
}
Common::Error GobEngine::run() {
- if (!initGameParts()) {
- GUIErrorMessage("GobEngine::init(): Unknown version of game engine");
- return Common::kUnknownError;
- }
+ Common::Error err;
- if (!initGraphics()) {
- GUIErrorMessage("GobEngine::init(): Failed to set up graphics");
- return Common::kUnknownError;
- }
+ err = initGameParts();
+ if (err.getCode() != Common::kNoError)
+ return err;
+
+ err = initGraphics();
+ if (err.getCode() != Common::kNoError)
+ return err;
// On some systems it's not safe to run CD audio games from the CD.
if (isCD())
@@ -364,11 +376,12 @@ void GobEngine::pauseEngineIntern(bool pause) {
_game->_startTimeKey += duration;
_draw->_cursorTimeKey += duration;
- if (_inter->_soundEndTimeKey != 0)
+ if (_inter && (_inter->_soundEndTimeKey != 0))
_inter->_soundEndTimeKey += duration;
}
- _vidPlayer->pauseAll(pause);
+ if (_vidPlayer)
+ _vidPlayer->pauseAll(pause);
_mixer->pauseAll(pause);
}
@@ -388,10 +401,13 @@ void GobEngine::pauseGame() {
pauseEngineIntern(false);
}
-bool GobEngine::initGameParts() {
+Common::Error GobEngine::initGameParts() {
+ _resourceSizeWorkaround = false;
+
// just detect some devices some of which will be always there if the music is not disabled
_noMusic = MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB)) == MT_NULL ? true : false;
- _saveLoad = 0;
+
+ _endiannessMethod = kEndiannessMethodSystem;
_global = new Global(this);
_util = new Util(this);
@@ -423,6 +439,8 @@ bool GobEngine::initGameParts() {
_goblin = new Goblin_v1(this);
_scenery = new Scenery_v1(this);
_saveLoad = new SaveLoad_Geisha(this, _targetName.c_str());
+
+ _endiannessMethod = kEndiannessMethodAltFile;
break;
case kGameTypeFascination:
@@ -462,6 +480,33 @@ bool GobEngine::initGameParts() {
_saveLoad = new SaveLoad_v2(this, _targetName.c_str());
break;
+ case kGameTypeLittleRed:
+ _init = new Init_v2(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_LittleRed(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v2(this);
+ _scenery = new Scenery_v2(this);
+
+ // WORKAROUND: Little Red Riding Hood has a small resource size glitch in the
+ // screen where Little Red needs to find the animals' homes.
+ _resourceSizeWorkaround = true;
+ break;
+
+ case kGameTypeAJWorld:
+ _init = new Init_v2(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v2(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_AJWorld(this, _targetName.c_str());
+ break;
+
case kGameTypeGob3:
_init = new Init_v3(this);
_video = new Video_v2(this);
@@ -572,20 +617,45 @@ bool GobEngine::initGameParts() {
_scenery = new Scenery_v2(this);
_saveLoad = new SaveLoad_v2(this, _targetName.c_str());
break;
+
+ case kGameTypeAbracadabra:
+ _init = new Init_v2(this);
+ _video = new Video_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v2(this);
+ _scenery = new Scenery_v2(this);
+ _preGob = new OnceUpon::Abracadabra(this);
+ break;
+
+ case kGameTypeBabaYaga:
+ _init = new Init_v2(this);
+ _video = new Video_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v2(this);
+ _scenery = new Scenery_v2(this);
+ _preGob = new OnceUpon::BabaYaga(this);
+ break;
+
default:
deinitGameParts();
- return false;
+ return Common::kUnsupportedGameidError;
}
// Setup mixer
syncSoundSettings();
- _inter->setupOpcodes();
+ if (_inter)
+ _inter->setupOpcodes();
- return true;
+ return Common::kNoError;
}
void GobEngine::deinitGameParts() {
+ delete _preGob; _preGob = 0;
delete _saveLoad; _saveLoad = 0;
delete _mult; _mult = 0;
delete _vidPlayer; _vidPlayer = 0;
@@ -604,10 +674,10 @@ void GobEngine::deinitGameParts() {
delete _dataIO; _dataIO = 0;
}
-bool GobEngine::initGraphics() {
+Common::Error GobEngine::initGraphics() {
if (is800x600()) {
warning("GobEngine::initGraphics(): 800x600 games currently unsupported");
- return false;
+ return Common::kUnsupportedGameidError;
} else if (is640x480()) {
_width = 640;
_height = 480;
@@ -631,7 +701,7 @@ bool GobEngine::initGraphics() {
_global->_primarySurfDesc = SurfacePtr(new Surface(_width, _height, _pixelFormat.bytesPerPixel));
- return true;
+ return Common::kNoError;
}
} // End of namespace Gob