aboutsummaryrefslogtreecommitdiff
path: root/engines/voyeur
diff options
context:
space:
mode:
Diffstat (limited to 'engines/voyeur')
-rw-r--r--engines/voyeur/events.cpp85
-rw-r--r--engines/voyeur/events.h11
-rw-r--r--engines/voyeur/files.cpp32
-rw-r--r--engines/voyeur/files.h13
-rw-r--r--engines/voyeur/game.cpp5
-rw-r--r--engines/voyeur/game.h7
-rw-r--r--engines/voyeur/graphics.cpp15
-rw-r--r--engines/voyeur/graphics.h6
-rw-r--r--engines/voyeur/voyeur.cpp36
9 files changed, 189 insertions, 21 deletions
diff --git a/engines/voyeur/events.cpp b/engines/voyeur/events.cpp
index 7a9bd5aa55..29959a8fae 100644
--- a/engines/voyeur/events.cpp
+++ b/engines/voyeur/events.cpp
@@ -22,10 +22,11 @@
#include "voyeur/events.h"
#include "voyeur/voyeur.h"
+#include "graphics/palette.h"
namespace Voyeur {
-EventsManager::EventsManager() {
+EventsManager::EventsManager(): _intPtr(_audioStruc) {
_cycleStatus = 0;
_mouseButton = 0;
_priorFrameTime = g_system->getMillis();
@@ -56,7 +57,7 @@ void EventsManager::sWaitFlip() {
// TODO: See if this needs a proper wait loop with event polling
//while (_intPtr._field39) ;
- Common::Array<ViewPortResource *> &viewPorts = *_vm->_graphicsManager._viewPortListPtr;
+ Common::Array<ViewPortResource *> &viewPorts = _vm->_graphicsManager._viewPortListPtr->_entries;
for (uint idx = 0; idx < viewPorts.size(); ++idx) {
ViewPortResource &viewPort = *viewPorts[idx];
@@ -81,6 +82,9 @@ void EventsManager::checkForNextFrameCounter() {
++_gameCounter;
_priorFrameTime = milli;
+ // Run the timer-based updates
+ videoTimer();
+
// Display the frame
g_system->copyRectToScreen((byte *)_vm->_graphicsManager._screenSurface.pixels,
SCREEN_WIDTH, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
@@ -91,7 +95,18 @@ void EventsManager::checkForNextFrameCounter() {
}
}
-void EventsManager::delay(int totalMilli) {
+void EventsManager::videoTimer() {
+ if (_audioStruc._hasPalette) {
+ _audioStruc._hasPalette = false;
+
+ g_system->getPaletteManager()->setPalette(_audioStruc._palette,
+ _audioStruc._palStartIndex,
+ _audioStruc._palEndIndex - _audioStruc._palStartIndex + 1);
+ }
+}
+
+void EventsManager::delay(int cycles) {
+ uint32 totalMilli = cycles * 1000 / GAME_FRAME_RATE;
uint32 delayEnd = g_system->getMillis() + totalMilli;
while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
@@ -134,4 +149,68 @@ void EventsManager::pollEvents() {
}
}
+void EventsManager::startFade(CMapResource *cMap) {
+ _fadeIntNode._flags |= 1;
+ if (_cycleStatus & 1)
+ _cycleIntNode._flags |= 1;
+
+ _fadeFirstCol = cMap->_start;
+ _fadeLastCol = cMap->_end;
+ _fadeCount = cMap->_steps + 1;
+
+ if (cMap->_steps > 0) {
+ _vm->_graphicsManager._fadeStatus = cMap->_fadeStatus;
+ uint16 *destP = (uint16 *)(_vm->_graphicsManager._viewPortListPtr->_palette +
+ (_fadeFirstCol * 16));
+ byte *vgaP = &_vm->_graphicsManager._VGAColors[_fadeFirstCol * 3];
+ int mapIndex = 0;
+
+ for (int idx = _fadeFirstCol; idx <= _fadeLastCol; ++idx) {
+ destP[0] = vgaP[0] << 8;
+ uint32 rComp = (uint16)((cMap->_entries[mapIndex * 3] << 8) - destP[0]) | 0x80;
+ destP[3] = rComp / cMap->_steps;
+
+ destP[1] = vgaP[1] << 8;
+ uint32 gComp = (uint16)((cMap->_entries[mapIndex * 3 + 1] << 8) - destP[1]) | 0x80;
+ destP[4] = gComp / cMap->_steps;
+
+ destP[2] = vgaP[2] << 8;
+ uint32 bComp = (uint16)((cMap->_entries[mapIndex * 3 + 2] << 8) - destP[2]) | 0x80;
+ destP[5] = bComp / cMap->_steps;
+ destP[6] = bComp % cMap->_steps;
+
+ destP += 8;
+
+ if (!(cMap->_fadeStatus & 1))
+ ++mapIndex;
+ }
+
+ if (cMap->_fadeStatus & 2)
+ _intPtr._field3B = 1;
+ _fadeIntNode._flags &= ~1;
+ } else {
+ byte *vgaP = &_vm->_graphicsManager._VGAColors[_fadeFirstCol * 3];
+ int mapIndex = 0;
+
+ for (int idx = _fadeFirstCol; idx <= _fadeLastCol; ++idx, vgaP += 3) {
+ Common::copy(&cMap->_entries[mapIndex], &cMap->_entries[mapIndex + 3], vgaP);
+
+ if (!(cMap->_fadeStatus & 1))
+ mapIndex += 3;
+ }
+
+ if (_intPtr._palStartIndex > _fadeFirstCol)
+ _intPtr._palStartIndex = _fadeFirstCol;
+ if (_intPtr._palEndIndex < _fadeLastCol)
+ _intPtr._palEndIndex = _fadeLastCol;
+
+ _intPtr._hasPalette = true;
+ if (!(cMap->_fadeStatus & 2))
+ _intPtr._field38 = 1;
+ }
+
+ if (_cycleStatus & 1)
+ _cycleIntNode._flags &= ~1;
+}
+
} // End of namespace Voyeur
diff --git a/engines/voyeur/events.h b/engines/voyeur/events.h
index 249db4a1fd..f19a6ec7c2 100644
--- a/engines/voyeur/events.h
+++ b/engines/voyeur/events.h
@@ -29,6 +29,7 @@
namespace Voyeur {
class VoyeurEngine;
+class CMapResource;
#define GAME_FRAME_RATE 50
#define GAME_FRAME_TIME (1000 / GAME_FRAME_RATE)
@@ -44,14 +45,17 @@ private:
static void mainVoyeurIntFunc();
private:
void checkForNextFrameCounter();
-
+ void videoTimer();
public:
- IntData _intPtr;
+ IntData _audioStruc;
+ IntData &_intPtr;
IntNode _fadeIntNode;
IntNode _cycleIntNode;
IntNode _evintnode;
IntNode _mainIntNode;
int _cycleStatus;
+ int _fadeFirstCol, _fadeLastCol;
+ int _fadeCount;
public:
EventsManager();
void setVm(VoyeurEngine *vm) { _vm = vm; }
@@ -61,8 +65,9 @@ public:
void vStopCycle();
void sWaitFlip();
- void delay(int totalMilli);
+ void delay(int cycles);
void pollEvents();
+ void startFade(CMapResource *cMap);
};
} // End of namespace Voyeur
diff --git a/engines/voyeur/files.cpp b/engines/voyeur/files.cpp
index 758ba9f481..4970fc2d24 100644
--- a/engines/voyeur/files.cpp
+++ b/engines/voyeur/files.cpp
@@ -251,6 +251,10 @@ bool BoltFile::getBoltGroup(uint32 id) {
return true;
}
+void BoltFile::freeBoltGroup(uint32 id) {
+ warning("TODO: freeBoltGroup");
+}
+
BoltEntry &BoltFile::getBoltEntry(uint32 id) {
BoltGroup &group = _groups[id >> 24];
assert(group._loaded);
@@ -268,6 +272,13 @@ PictureResource *BoltFile::getPictureResouce(uint32 id) {
return getBoltEntry(id)._picResource;
}
+CMapResource *BoltFile::getCMapResource(uint32 id) {
+ if ((int32)id == -1)
+ return NULL;
+
+ return getBoltEntry(id)._cMapResource;
+}
+
byte *BoltFile::memberAddr(uint32 id) {
BoltGroup &group = _groups[id >> 8];
if (!group._loaded)
@@ -417,7 +428,7 @@ void BoltFile::initViewPortList() {
_state._curMemberPtr->_viewPortListResource = res = new ViewPortListResource(
_state, _state._curMemberPtr->_data);
- _state._vm->_graphicsManager._viewPortListPtr = &res->_entries;
+ _state._vm->_graphicsManager._viewPortListPtr = res;
_state._vm->_graphicsManager._vPort = &res->_entries[0];
}
@@ -441,6 +452,7 @@ BoltGroup::BoltGroup(Common::SeekableReadStream *f): _file(f) {
_file->read(&buffer[0], BOLT_GROUP_SIZE);
_processed = buffer[0] != 0;
_callInitGro = buffer[1] != 0;
+ _termGroIndex = buffer[2];
_count = buffer[3] ? buffer[3] : 256; // TODO: Added this in. Check it's okay
_fileOffset = READ_LE_UINT32(&buffer[8]);
}
@@ -546,8 +558,7 @@ PictureResource::PictureResource(BoltFilesState &state, const byte *src) {
if (mode != state._vm->_graphicsManager._SVGAMode) {
state._vm->_graphicsManager._SVGAMode = mode;
- // TODO: If necessary, simulate SVGA mode change
- warning("TODO: May need to implement SVGA stub code");
+ state._vm->_graphicsManager.clearPalette();
}
// byte *imgData = _imgData;
@@ -746,6 +757,8 @@ ViewPortListResource::ViewPortListResource(BoltFilesState &state, const byte *sr
assert(entry._viewPortResource);
_entries.push_back(entry._viewPortResource);
}
+
+ state._curLibPtr->resolveIt(READ_LE_UINT32(src + 4), &_palette);
}
/*------------------------------------------------------------------------*/
@@ -756,17 +769,22 @@ FontResource::FontResource(BoltFilesState &state, const byte *src) {
/*------------------------------------------------------------------------*/
-CMapResource::CMapResource(BoltFilesState &state, const byte *src) {
+CMapResource::CMapResource(BoltFilesState &state, const byte *src): _vm(state._vm) {
+ _steps = READ_LE_UINT16(src);
_start = READ_LE_UINT16(src + 2);
_end = READ_LE_UINT16(src + 4);
int count = _end - _start;
- _palette = new byte[count * 3];
- Common::copy(src + 6, src + 6 + 3 * count, _palette);
+ _entries = new byte[count * 3];
+ Common::copy(src + 6, src + 6 + 3 * count, _entries);
}
CMapResource::~CMapResource() {
- delete[] _palette;
+ delete[] _entries;
+}
+
+void CMapResource::startFade() {
+ _vm->_eventsManager.startFade(this);
}
/*------------------------------------------------------------------------*/
diff --git a/engines/voyeur/files.h b/engines/voyeur/files.h
index da3d277f73..49d6db1333 100644
--- a/engines/voyeur/files.h
+++ b/engines/voyeur/files.h
@@ -127,6 +127,7 @@ public:
~BoltFile();
bool getBoltGroup(uint32 id);
+ void freeBoltGroup(uint32 id);
byte *memberAddr(uint32 id);
byte *memberAddrOffset(uint32 id);
void resolveIt(uint32 id, byte **p);
@@ -134,6 +135,7 @@ public:
BoltEntry &getBoltEntry(uint32 id);
PictureResource *getPictureResouce(uint32 id);
+ CMapResource *getCMapResource(uint32 id);
};
class BoltGroup {
@@ -143,6 +145,7 @@ public:
byte _loaded;
bool _processed;
bool _callInitGro;
+ int _termGroIndex;
int _count;
int _fileOffset;
Common::Array<BoltEntry> _entries;
@@ -254,7 +257,7 @@ public:
class ViewPortListResource {
public:
- byte *_field4;
+ byte *_palette;
Common::Array<ViewPortResource *> _entries;
ViewPortListResource(BoltFilesState &state, const byte *src);
@@ -270,13 +273,19 @@ public:
};
class CMapResource {
+private:
+ VoyeurEngine *_vm;
public:
+ int _steps;
+ int _fadeStatus;
int _start;
int _end;
- byte *_palette;
+ byte *_entries;
public:
CMapResource(BoltFilesState &state, const byte *src);
virtual ~CMapResource();
+
+ void startFade();
};
class VInitCyclResource {
diff --git a/engines/voyeur/game.cpp b/engines/voyeur/game.cpp
index 9167cd942b..7c1f49f64f 100644
--- a/engines/voyeur/game.cpp
+++ b/engines/voyeur/game.cpp
@@ -27,7 +27,12 @@ namespace Voyeur {
IntData::IntData() {
_field9 = false;
_flipWait = false;
+ _hasPalette = false;
+ _field3B = 0;
_field2A = 0;
+ _palStartIndex = 0;
+ _palEndIndex = 0;
+ _palette = NULL;
}
void IntData::audioInit() {
diff --git a/engines/voyeur/game.h b/engines/voyeur/game.h
index d99df39c02..2b9864cb3e 100644
--- a/engines/voyeur/game.h
+++ b/engines/voyeur/game.h
@@ -114,7 +114,12 @@ public:
bool _field9;
bool _flipWait;
int _field2A;
- byte *_colors;
+ bool _hasPalette;
+ int _field38;
+ int _field3B;
+ int _palStartIndex;
+ int _palEndIndex;
+ byte *_palette;
Common::List<IntNode *> _intNodes;
public:
IntData();
diff --git a/engines/voyeur/graphics.cpp b/engines/voyeur/graphics.cpp
index fb32e75b91..a172483d00 100644
--- a/engines/voyeur/graphics.cpp
+++ b/engines/voyeur/graphics.cpp
@@ -24,6 +24,7 @@
#include "voyeur/game.h"
#include "voyeur/voyeur.h"
#include "engines/util.h"
+#include "graphics/palette.h"
#include "graphics/surface.h"
namespace Voyeur {
@@ -47,6 +48,8 @@ void GraphicsManager::sInitGraphics() {
initGraphics(SCREEN_WIDTH, SCREEN_HEIGHT, false);
_screenSurface.create(SCREEN_WIDTH, SCREEN_HEIGHT,
Graphics::PixelFormat::createFormatCLUT8());
+
+ clearPalette();
}
GraphicsManager::~GraphicsManager() {
@@ -360,7 +363,7 @@ void GraphicsManager::EMSMapPageHandle(int v1, int v2, int v3) {
}
void GraphicsManager::flipPage() {
- Common::Array<ViewPortResource *> &viewPorts = *_viewPortListPtr;
+ Common::Array<ViewPortResource *> &viewPorts = _viewPortListPtr->_entries;
bool flipFlag = false;
for (uint idx = 0; idx < viewPorts.size(); ++idx) {
@@ -405,4 +408,14 @@ void GraphicsManager::restoreBack(Common::Array<Common::Rect> &rectList, int rec
_saveBack = saveBack;
}
+void GraphicsManager::clearPalette() {
+ byte palette[768];
+ Common::fill(&palette[0], &palette[768], 0);
+ g_system->getPaletteManager()->setPalette(&palette[0], 0, 256);
+}
+
+void GraphicsManager::screenReset() {
+ // TODO
+}
+
} // End of namespace Voyeur
diff --git a/engines/voyeur/graphics.h b/engines/voyeur/graphics.h
index 1eec37bab7..98f01c3bbe 100644
--- a/engines/voyeur/graphics.h
+++ b/engines/voyeur/graphics.h
@@ -41,6 +41,7 @@ class GraphicsManager;
class DisplayResource;
class PictureResource;
class ViewPortResource;
+class ViewPortListResource;
typedef void (GraphicsManager::*GraphicMethodPtr)();
typedef void (GraphicsManager::*ViewPortSetupPtr)(ViewPortResource *);
@@ -57,7 +58,7 @@ public:
int _SVGAPage;
int _SVGAMode;
int _SVGAReset;
- Common::Array<ViewPortResource *> *_viewPortListPtr;
+ ViewPortListResource *_viewPortListPtr;
ViewPortResource **_vPort;
bool _MCGAMode;
bool _saveBack;
@@ -66,6 +67,7 @@ public:
uint _planeSelect;
int _sImageShift;
Graphics::Surface _screenSurface;
+ int _fadeStatus;
private:
static void fadeIntFunc();
static void vDoFadeInt();
@@ -92,6 +94,8 @@ public:
void sDrawPic(DisplayResource *srcDisplay, DisplayResource *destDisplay, const Common::Point &offset);
void sDisplayPic(PictureResource *pic);
void flipPage();
+ void clearPalette();
+ void screenReset();
};
} // End of namespace Voyeur
diff --git a/engines/voyeur/voyeur.cpp b/engines/voyeur/voyeur.cpp
index 79fb2fb0ca..18f3edfecc 100644
--- a/engines/voyeur/voyeur.cpp
+++ b/engines/voyeur/voyeur.cpp
@@ -132,7 +132,7 @@ void VoyeurEngine::initBolt() {
}
void VoyeurEngine::vInitInterrupts() {
- _eventsManager._intPtr._colors = &_graphicsManager._VGAColors[0];
+ _eventsManager._intPtr._palette = &_graphicsManager._VGAColors[0];
}
void VoyeurEngine::initInput() {
@@ -142,6 +142,8 @@ void VoyeurEngine::doHeadTitle() {
// char dest[144];
_eventsManager.startMainClockInt();
+
+ // Show starting screen
if (_bVoy->getBoltGroup(0x10500)) {
_graphicsManager._backgroundPage = _bVoy->getBoltEntry(0x5020000)._picResource;
(*_graphicsManager._vPort)->setupViewPort();
@@ -150,8 +152,36 @@ void VoyeurEngine::doHeadTitle() {
_graphicsManager.flipPage();
_eventsManager.sWaitFlip();
- // TODO:
- _eventsManager.delay(1000);
+ // Fade in the screen
+ CMapResource *cMap = _bVoy->getCMapResource(0x5010000);
+ assert(cMap);
+ cMap->_steps = 60;
+ cMap->startFade();
+
+ _eventsManager.delay(150);
+ if (shouldQuit())
+ return;
+ /* Commented out until fade in is working
+ // Fade out the screen
+ cMap->_steps = 30;
+ cMap->startFade();
+ if (shouldQuit())
+ return;
+
+ (*_graphicsManager._vPort)->_flags |= 8;
+ _graphicsManager.flipPage();
+ _eventsManager.sWaitFlip();
+
+ while (!shouldQuit() && (_graphicsManager._fadeStatus & 1))
+ _eventsManager.delay(1);
+
+ _graphicsManager.screenReset();
+ _bVoy->freeBoltGroup(0x10500);
+ _graphicsManager.screenReset();
+
+ if (shouldQuit())
+ return;
+ */
}
}