aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorJohannes Schickel2006-05-03 13:40:21 +0000
committerJohannes Schickel2006-05-03 13:40:21 +0000
commit96fd5e1fbcf7ab7af9127b520b620eba95819f06 (patch)
tree79a1ad5fcfc72d666c3d161f84e9dc5816614538 /engines
parent1d6a1bf15717c4922e8e81078027569c75494dba (diff)
downloadscummvm-rg350-96fd5e1fbcf7ab7af9127b520b620eba95819f06.tar.gz
scummvm-rg350-96fd5e1fbcf7ab7af9127b520b620eba95819f06.tar.bz2
scummvm-rg350-96fd5e1fbcf7ab7af9127b520b620eba95819f06.zip
- modifies loadBitmap not to crash if a image isn't found
- starts to clean up the engine initalisation code svn-id: r22308
Diffstat (limited to 'engines')
-rw-r--r--engines/kyra/kyra.cpp27
-rw-r--r--engines/kyra/kyra.h18
-rw-r--r--engines/kyra/resource.cpp13
-rw-r--r--engines/kyra/screen.cpp64
-rw-r--r--engines/kyra/screen.h2
-rw-r--r--engines/kyra/staticres.cpp3
6 files changed, 82 insertions, 45 deletions
diff --git a/engines/kyra/kyra.cpp b/engines/kyra/kyra.cpp
index 8b92f8eb6c..4744e86cae 100644
--- a/engines/kyra/kyra.cpp
+++ b/engines/kyra/kyra.cpp
@@ -287,11 +287,7 @@ KyraEngine_v1::KyraEngine_v1(OSystem *system)
:KyraEngine(system) {
}
-KyraEngine_v2::KyraEngine_v2(OSystem *system)
- :KyraEngine(system) {
-}
-
-int KyraEngine::init() {
+int KyraEngine_v1::setupGameFlags() {
// Detect game features based on MD5. Again brutally ripped from Gobliins.
uint8 md5sum[16];
char md5str[32 + 1];
@@ -361,6 +357,18 @@ int KyraEngine::init() {
return -1;
}
+ return 0;
+}
+
+KyraEngine_v2::KyraEngine_v2(OSystem *system)
+ :KyraEngine(system) {
+}
+
+int KyraEngine::init() {
+ if (setupGameFlags()) {
+ return -1;
+ }
+
// Setup mixer
if (!_mixer->isReady()) {
warning("Sound initialization failed.");
@@ -382,13 +390,6 @@ int KyraEngine::init() {
Common::addSpecialDebugLevel(kDebugLevelSequence, "Sequence", "Sequence debug level");
Common::addSpecialDebugLevel(kDebugLevelMovie, "Movie", "Movie debug level");
- _system->beginGFXTransaction();
- initCommonGFX(false);
- //for debug reasons (see Screen::updateScreen)
- //_system->initSize(640, 200);
- _system->initSize(320, 200);
- _system->endGFXTransaction();
-
// for now we prefer Adlib over native MIDI
int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB/* | MDT_PREFER_MIDI*/);
@@ -432,6 +433,7 @@ int KyraEngine::init() {
assert(_res);
_screen = new Screen(this, _system);
assert(_screen);
+ assert(_screen->init());
_sprites = new Sprites(this, _system);
assert(_sprites);
_seq = new SeqPlayer(this, _system);
@@ -442,6 +444,7 @@ int KyraEngine::init() {
assert(*_animator);
_text = new TextDisplayer(_screen);
assert(_text);
+
_staticres = new StaticResource(this);
assert(_staticres);
assert(_staticres->init());
diff --git a/engines/kyra/kyra.h b/engines/kyra/kyra.h
index 00edec8860..fb90a27fe2 100644
--- a/engines/kyra/kyra.h
+++ b/engines/kyra/kyra.h
@@ -247,6 +247,8 @@ public:
KyraEngine(OSystem *system);
~KyraEngine();
+
+ virtual int setupGameFlags() = 0;
void errorString(const char *buf_input, char *buf_output);
@@ -987,15 +989,19 @@ protected:
};
class KyraEngine_v1 : public KyraEngine {
- public:
- KyraEngine_v1(OSystem *system);
- ~KyraEngine_v1();
+public:
+ KyraEngine_v1(OSystem *system);
+ ~KyraEngine_v1();
+
+ int setupGameFlags();
};
class KyraEngine_v2 : public KyraEngine {
- public:
- KyraEngine_v2(OSystem *system);
- ~KyraEngine_v2();
+public:
+ KyraEngine_v2(OSystem *system);
+ ~KyraEngine_v2();
+
+ int setupGameFlags() { return 0; }
int go();
};
diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp
index 2be62a5beb..84dcf39efa 100644
--- a/engines/kyra/resource.cpp
+++ b/engines/kyra/resource.cpp
@@ -397,16 +397,24 @@ void KyraEngine::loadBitmap(const char *filename, int tempPage, int dstPage, uin
debugC(9, kDebugLevelMain, "KyraEngine::loadBitmap('%s', %d, %d, %p)", filename, tempPage, dstPage, (void *)palData);
uint32 fileSize;
uint8 *srcData = _res->fileData(filename, &fileSize);
- assert(srcData);
+
+ if (!srcData) {
+ warning("coudln't load bitmap: '%s'", filename);
+ return;
+ }
+
uint8 compType = srcData[2];
uint32 imgSize = READ_LE_UINT32(srcData + 4);
uint16 palSize = READ_LE_UINT16(srcData + 8);
+
if (palData && palSize) {
debugC(9, kDebugLevelMain,"Loading a palette of size %i from %s", palSize, filename);
memcpy(palData, srcData + 10, palSize);
}
+
uint8 *srcPtr = srcData + 10 + palSize;
uint8 *dstData = _screen->getPagePtr(dstPage);
+
switch (compType) {
case 0:
memcpy(dstData, srcPtr, imgSize);
@@ -421,7 +429,8 @@ void KyraEngine::loadBitmap(const char *filename, int tempPage, int dstPage, uin
error("Unhandled bitmap compression %d", compType);
break;
}
- delete[] srcData;
+
+ delete [] srcData;
}
} // end of namespace Kyra
diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp
index eed2ba15c5..495626e539 100644
--- a/engines/kyra/screen.cpp
+++ b/engines/kyra/screen.cpp
@@ -32,6 +32,44 @@ namespace Kyra {
Screen::Screen(KyraEngine *vm, OSystem *system)
: _system(system), _vm(vm) {
+}
+
+Screen::~Screen() {
+ for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) {
+ free(_pagePtrs[pageNum]);
+ _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = 0;
+ }
+ for (int f = 0; f < ARRAYSIZE(_fonts); ++f) {
+ delete[] _fonts[f].fontData;
+ _fonts[f].fontData = NULL;
+ }
+ free(_currentPalette);
+ free(_screenPalette);
+ free(_decodeShapeBuffer);
+ free(_animBlockPtr);
+ for (int i = 0; i < 3; ++i) {
+ free(_palettes[i]);
+ }
+ delete [] _bitBlitRects;
+ for (int i = 0; i < ARRAYSIZE(_saveLoadPage); ++i) {
+ delete [] _saveLoadPage[i];
+ _saveLoadPage[i] = 0;
+ }
+
+ free(_unkPtr1);
+ free(_unkPtr2);
+}
+
+bool Screen::init() {
+ debugC(9, kDebugLevelScreen, "Screen::init()");
+
+ _system->beginGFXTransaction();
+ _vm->initCommonGFX(false);
+ //for debug reasons (see Screen::updateScreen)
+ //_system->initSize(640, 200);
+ _system->initSize(320, 200);
+ _system->endGFXTransaction();
+
_curPage = 0;
for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) {
uint8 *pagePtr = (uint8 *)malloc(SCREEN_PAGE_SIZE);
@@ -78,32 +116,8 @@ Screen::Screen(KyraEngine *vm, OSystem *system)
memset(_unkPtr1, 0, getRectSize(1, 144));
_unkPtr2 = (uint8*)malloc(getRectSize(1, 144));
memset(_unkPtr2, 0, getRectSize(1, 144));
-}
-Screen::~Screen() {
- for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) {
- free(_pagePtrs[pageNum]);
- _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = 0;
- }
- for (int f = 0; f < ARRAYSIZE(_fonts); ++f) {
- delete[] _fonts[f].fontData;
- _fonts[f].fontData = NULL;
- }
- free(_currentPalette);
- free(_screenPalette);
- free(_decodeShapeBuffer);
- free(_animBlockPtr);
- for (int i = 0; i < 3; ++i) {
- free(_palettes[i]);
- }
- delete [] _bitBlitRects;
- for (int i = 0; i < ARRAYSIZE(_saveLoadPage); ++i) {
- delete [] _saveLoadPage[i];
- _saveLoadPage[i] = 0;
- }
-
- free(_unkPtr1);
- free(_unkPtr2);
+ return true;
}
void Screen::updateScreen() {
diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h
index c5ab29f682..2e208c0ca1 100644
--- a/engines/kyra/screen.h
+++ b/engines/kyra/screen.h
@@ -89,6 +89,8 @@ public:
Screen(KyraEngine *vm, OSystem *system);
~Screen();
+ bool init();
+
void updateScreen();
uint8 *getPagePtr(int pageNum);
void clearPage(int pageNum);
diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp
index 8d5b058ba9..56cb68e3e3 100644
--- a/engines/kyra/staticres.cpp
+++ b/engines/kyra/staticres.cpp
@@ -750,6 +750,8 @@ void KyraEngine::loadButtonShapes() {
}
void KyraEngine::loadMainScreen(int page) {
+ _screen->clearPage(page);
+
if ((_features & GF_ENGLISH) && (_features & GF_TALKIE))
loadBitmap("MAIN_ENG.CPS", page, page, 0);
else if(_features & GF_FRENCH)
@@ -765,6 +767,7 @@ void KyraEngine::loadMainScreen(int page) {
uint8 *_pageSrc = _screen->getPagePtr(page);
uint8 *_pageDst = _screen->getPagePtr(0);
+
memcpy(_pageDst, _pageSrc, 320*200);
}