aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/voyeur/files.cpp80
-rw-r--r--engines/voyeur/files.h26
-rw-r--r--engines/voyeur/graphics.cpp22
-rw-r--r--engines/voyeur/graphics.h10
-rw-r--r--engines/voyeur/voyeur.cpp3
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();
+
}
}