diff options
author | Johannes Schickel | 2006-05-03 13:40:21 +0000 |
---|---|---|
committer | Johannes Schickel | 2006-05-03 13:40:21 +0000 |
commit | 96fd5e1fbcf7ab7af9127b520b620eba95819f06 (patch) | |
tree | 79a1ad5fcfc72d666c3d161f84e9dc5816614538 /engines | |
parent | 1d6a1bf15717c4922e8e81078027569c75494dba (diff) | |
download | scummvm-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.cpp | 27 | ||||
-rw-r--r-- | engines/kyra/kyra.h | 18 | ||||
-rw-r--r-- | engines/kyra/resource.cpp | 13 | ||||
-rw-r--r-- | engines/kyra/screen.cpp | 64 | ||||
-rw-r--r-- | engines/kyra/screen.h | 2 | ||||
-rw-r--r-- | engines/kyra/staticres.cpp | 3 |
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); } |