diff options
-rw-r--r-- | engines/voyeur/files.cpp | 80 | ||||
-rw-r--r-- | engines/voyeur/files.h | 26 | ||||
-rw-r--r-- | engines/voyeur/graphics.cpp | 22 | ||||
-rw-r--r-- | engines/voyeur/graphics.h | 10 | ||||
-rw-r--r-- | engines/voyeur/voyeur.cpp | 3 |
5 files changed, 102 insertions, 39 deletions
diff --git a/engines/voyeur/files.cpp b/engines/voyeur/files.cpp index 74c2f17103..70a6a6ef08 100644 --- a/engines/voyeur/files.cpp +++ b/engines/voyeur/files.cpp @@ -251,12 +251,27 @@ bool BoltFile::getBoltGroup(uint32 id) { return true; } +BoltEntry &BoltFile::getBoltEntry(uint32 id) { + BoltGroup &group = _groups[id >> 8]; + assert(!group._loaded); + + BoltEntry &entry = group._entries[id & 0xff]; + assert(!entry.hasResource() || (id & 0xffff) == 0); + + return entry; +} + byte *BoltFile::memberAddr(uint32 id) { BoltGroup &group = _groups[id >> 8]; if (!group._loaded) return NULL; - return group._entries[id & 0xff]._data; + // If an entry already has a processed representation, we shouldn't + // still be accessing the raw data + BoltEntry &entry = group._entries[id & 0xff]; + assert(!entry.hasResource()); + + return entry._data; } byte *BoltFile::memberAddrOffset(uint32 id) { @@ -264,7 +279,12 @@ byte *BoltFile::memberAddrOffset(uint32 id) { if (!group._loaded) return NULL; - return group._entries[(id >> 16) & 0xff]._data + (id & 0xffff); + // If an entry already has a processed representation, we shouldn't + // still be accessing the raw data + BoltEntry &entry = group._entries[(id >> 16) & 0xff]; + assert(!entry.hasResource()); + + return entry._data + (id & 0xffff); } /** @@ -459,6 +479,14 @@ void BoltEntry::load() { // Ideally, a lot of the code should be moved here } +/** + * Returns true if the given bolt entry has an attached resource + */ +bool BoltEntry::hasResource() const { + return _picResource || _viewPortResource || _viewPortListResource + || _fontResource || _cMapResource || _vInitCyclResource; +} + /*------------------------------------------------------------------------*/ PictureResource::PictureResource(BoltFilesState &state, const byte *src) { @@ -551,8 +579,15 @@ PictureResource::~PictureResource() { /*------------------------------------------------------------------------*/ -ViewPortResource::ViewPortResource(BoltFilesState &state, const byte *src) { +ViewPortResource::ViewPortResource(BoltFilesState &state, const byte *src): + _state(state) { state._curLibPtr->resolveIt(READ_LE_UINT32(src + 2), &_field2); + _fieldC = READ_LE_UINT16(src + 0xC); + _fieldE = READ_LE_UINT16(src + 0xE); + _field10 = READ_LE_UINT16(src + 0x10); + _field12 = READ_LE_UINT16(src + 0x12); + _field18 = READ_LE_UINT16(src + 0x18); + state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x20), &_field20); state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x24), &_field24); state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x28), &_field28); @@ -561,6 +596,12 @@ ViewPortResource::ViewPortResource(BoltFilesState &state, const byte *src) { state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x34), &_field34); state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x38), &_field38); state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x3C), &_field3C); + + _field46 = READ_LE_UINT16(src + 0x46); + _field48 = READ_LE_UINT16(src + 0x48); + _field4A = READ_LE_UINT16(src + 0x4A); + _field4C = READ_LE_UINT16(src + 0x4C); + state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x7A), &_field7A); state._curLibPtr->resolveFunction(READ_LE_UINT32(src + 0x7E), &_fn1); @@ -572,6 +613,30 @@ ViewPortResource::ViewPortResource(BoltFilesState &state, const byte *src) { _fn3 = &BoltFile::addRectNoSaveBack; } +void ViewPortResource::setupViewPort(int v, ViewPortMethodPtr setupFn, + ViewPortMethodPtr addRectFn, ViewPortMethodPtr restoreFn, byte *page) { + byte *fld20 = _field20; + // TODO: More stuff +} + +void ViewPortResource::setupMCGASaveRect() { + +} + +void ViewPortResource::restoreMCGASaveRect() { + +} + +void ViewPortResource::addRectOptSaveRect() { + +} + +void ViewPortResource::setupViewPort() { + setupViewPort(0, &ViewPortResource::setupMCGASaveRect, + &ViewPortResource::addRectOptSaveRect, &ViewPortResource::restoreMCGASaveRect, + _state._vm->_graphicsManager._backgroundPage); +} + /*------------------------------------------------------------------------*/ ViewPortListResource::ViewPortListResource(BoltFilesState &state, const byte *src) { @@ -581,12 +646,13 @@ ViewPortListResource::ViewPortListResource(BoltFilesState &state, const byte *sr for (uint i = 0; i < count; ++i, ++idP) { uint32 id = READ_LE_UINT32(idP); - _entries.push_back(NULL); - state._curLibPtr->resolveIt(id, &_entries[_entries.size() - 1]); + BoltEntry &entry = state._curLibPtr->getBoltEntry(id); + + assert(entry._viewPortResource); + _entries.push_back(entry._viewPortResource); } - state._vm->_graphicsManager._vPort = &_entries[0]; - state._curLibPtr->resolveIt(READ_LE_UINT32(&src[4]), &_field4); + state._vm->_graphicsManager._vPort = _entries[0]; } /*------------------------------------------------------------------------*/ diff --git a/engines/voyeur/files.h b/engines/voyeur/files.h index eb0c313c3b..1bc9a9d8a3 100644 --- a/engines/voyeur/files.h +++ b/engines/voyeur/files.h @@ -126,6 +126,7 @@ public: ~BoltFile(); bool getBoltGroup(uint32 id); + BoltEntry &getBoltEntry(uint32 id); byte *memberAddr(uint32 id); byte *memberAddrOffset(uint32 id); void resolveIt(uint32 id, byte **p); @@ -174,6 +175,7 @@ public: virtual ~BoltEntry(); void load(); + bool hasResource() const; }; class FilesManager { @@ -207,9 +209,25 @@ public: virtual ~PictureResource(); }; +typedef void (ViewPortResource::*ViewPortMethodPtr)(); + class ViewPortResource { +private: + BoltFilesState &_state; + + void setupMCGASaveRect(); + void restoreMCGASaveRect(); + void addRectOptSaveRect(); +private: + void setupViewPort(int v, ViewPortMethodPtr setupFn, ViewPortMethodPtr addRectFn, + ViewPortMethodPtr restoreFn, byte *page); public: byte *_field2; + int _fieldC; + int _fieldE; + int _field10; + int _field12; + int _field18; byte *_field20; byte *_field24; byte *_field28; @@ -218,6 +236,10 @@ public: byte *_field34; byte *_field38; byte *_field3C; + int _field46; + int _field48; + int _field4A; + int _field4C; byte *_field7A; BoltMethodPtr _fn1; BoltMethodPtr _fn2; @@ -226,12 +248,14 @@ public: public: ViewPortResource(BoltFilesState &state, const byte *src); virtual ~ViewPortResource() {} + + void setupViewPort(); }; class ViewPortListResource { public: byte *_field4; - Common::Array<byte *> _entries; + Common::Array<ViewPortResource *> _entries; ViewPortListResource(BoltFilesState &state, const byte *src); virtual ~ViewPortListResource() {} diff --git a/engines/voyeur/graphics.cpp b/engines/voyeur/graphics.cpp index be8e5316fe..2686049fa6 100644 --- a/engines/voyeur/graphics.cpp +++ b/engines/voyeur/graphics.cpp @@ -66,26 +66,4 @@ void GraphicsManager::vDoCycleInt() { } -void GraphicsManager::setupViewPort() { - setupViewPort(&GraphicsManager::setupMCGASaveRect, &GraphicsManager::addRectOptSaveRect, - &GraphicsManager::restoreMCGASaveRect); -} - -void GraphicsManager::setupViewPort(GraphicMethodPtr setupFn, - GraphicMethodPtr addRectFn, GraphicMethodPtr restoreFn) { - -} - -void GraphicsManager::setupMCGASaveRect() { - -} - -void GraphicsManager::restoreMCGASaveRect() { - -} - -void GraphicsManager::addRectOptSaveRect() { - -} - } // End of namespace Voyeur diff --git a/engines/voyeur/graphics.h b/engines/voyeur/graphics.h index 152ce00d9e..ae23d28ebe 100644 --- a/engines/voyeur/graphics.h +++ b/engines/voyeur/graphics.h @@ -23,6 +23,7 @@ #ifndef VOYEUR_GRAPHICS_H #define VOYEUR_GRAPHICS_H +#include "voyeur/files.h" #include "voyeur/game.h" #include "common/scummsys.h" #include "common/array.h" @@ -49,19 +50,13 @@ public: byte *_backgroundPage; int _SVGAPage; int _SVGAMode; - byte **_vPort; + ViewPortResource *_vPort; private: static void fadeIntFunc(); static void vDoFadeInt(); static void vDoCycleInt(); - void setupMCGASaveRect(); - void restoreMCGASaveRect(); - void addRectOptSaveRect(); - void addIntNode(IntNode *node); - void setupViewPort(GraphicMethodPtr setupFn, GraphicMethodPtr addRectFn, - GraphicMethodPtr restoreFn); public: GraphicsManager(); void setVm(VoyeurEngine *vm) { _vm = vm; } @@ -69,7 +64,6 @@ public: void vInitColor(); void addFadeInt(); - void setupViewPort(); }; } // End of namespace Voyeur diff --git a/engines/voyeur/voyeur.cpp b/engines/voyeur/voyeur.cpp index 457d8639b3..2a4a1cdf6c 100644 --- a/engines/voyeur/voyeur.cpp +++ b/engines/voyeur/voyeur.cpp @@ -143,7 +143,8 @@ void VoyeurEngine::doHeadTitle() { _eventsManager.startMainClockInt(); if (_bVoy->getBoltGroup(0x10500)) { _graphicsManager._backgroundPage = _bVoy->memberAddr(0x502); -// _graphicsManager._vPort.setupViewPort(); + _graphicsManager._vPort->setupViewPort(); + } } |