aboutsummaryrefslogtreecommitdiff
path: root/engines/voyeur
diff options
context:
space:
mode:
authorPaul Gilbert2014-01-18 17:32:59 -0500
committerPaul Gilbert2014-01-18 17:32:59 -0500
commit3f50f14698193dc3f9c6904bc5d8f304d97a8b86 (patch)
tree75e878dc8d449aa1ea476a3130c117198ee69df9 /engines/voyeur
parentf084539957e461cd74179008f81791fd29f0d311 (diff)
downloadscummvm-rg350-3f50f14698193dc3f9c6904bc5d8f304d97a8b86.tar.gz
scummvm-rg350-3f50f14698193dc3f9c6904bc5d8f304d97a8b86.tar.bz2
scummvm-rg350-3f50f14698193dc3f9c6904bc5d8f304d97a8b86.zip
VOYEUR: Implemented remainder of reviewTape and dependent methods
Diffstat (limited to 'engines/voyeur')
-rw-r--r--engines/voyeur/data.cpp45
-rw-r--r--engines/voyeur/data.h2
-rw-r--r--engines/voyeur/sound.cpp4
-rw-r--r--engines/voyeur/sound.h1
-rw-r--r--engines/voyeur/voyeur.cpp12
-rw-r--r--engines/voyeur/voyeur_game.cpp150
6 files changed, 175 insertions, 39 deletions
diff --git a/engines/voyeur/data.cpp b/engines/voyeur/data.cpp
index f98478b723..1e40ff7096 100644
--- a/engines/voyeur/data.cpp
+++ b/engines/voyeur/data.cpp
@@ -189,4 +189,49 @@ void SVoy::addComputerEventEnd(int v) {
++_eventCount;
}
+void SVoy::reviewAnEvidEvent(int eventIndex) {
+ VoyeurEvent &e = _events[eventIndex];
+ _vm->_playStampGroupId = e._videoId;
+ _field47A = e._computerOn;
+ int frameOff = e._computerOff;
+
+ if (_vm->_bVoy->getBoltGroup(_vm->_playStampGroupId)) {
+ _vm->_graphicsManager._backColors = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 1)._cMapResource;
+ _vm->_graphicsManager._backgroundPage = _vm->_bVoy->boltEntry(_vm->_playStampGroupId)._picResource;
+ (*_vm->_graphicsManager._vPort)->setupViewPort(_vm->_graphicsManager._backgroundPage);
+ _vm->_graphicsManager._backColors->startFade();
+
+ _vm->doEvidDisplay(frameOff, e._dead);
+ _vm->_bVoy->freeBoltGroup(_vm->_playStampGroupId);
+ _vm->_playStampGroupId = -1;
+
+ if (_field47A != -1) {
+ _vm->_bVoy->freeBoltGroup(_field47A);
+ _field47A = -1;
+ }
+ }
+}
+
+void SVoy::reviewComputerEvent(int eventIndex) {
+ VoyeurEvent &e = _events[eventIndex];
+ _vm->_playStampGroupId = e._videoId;
+ _computerTextId = e._computerOn;
+
+ if (_vm->_bVoy->getBoltGroup(_vm->_playStampGroupId)) {
+ _vm->_graphicsManager._backColors = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 1)._cMapResource;
+ _vm->_graphicsManager._backgroundPage = _vm->_bVoy->boltEntry(_vm->_playStampGroupId)._picResource;
+ (*_vm->_graphicsManager._vPort)->setupViewPort(_vm->_graphicsManager._backgroundPage);
+ _vm->_graphicsManager._backColors->startFade();
+ _vm->flipPageAndWaitForFade();
+
+ _vm->getComputerBrush();
+ _vm->flipPageAndWait();
+ _vm->doComputerText(e._computerOff);
+
+ _vm->_bVoy->freeBoltGroup(0x4900);
+ _vm->_bVoy->freeBoltGroup(_vm->_playStampGroupId);
+ _vm->_playStampGroupId = -1;
+ }
+}
+
} // End of namespace Voyeur
diff --git a/engines/voyeur/data.h b/engines/voyeur/data.h
index 03545adea3..4fadf5b29b 100644
--- a/engines/voyeur/data.h
+++ b/engines/voyeur/data.h
@@ -133,6 +133,8 @@ public:
void addEvidEventEnd(int dead);
void addComputerEventStart();
void addComputerEventEnd(int v);
+ void reviewAnEvidEvent(int eventIndex);
+ void reviewComputerEvent(int eventIndex);
};
} // End of namespace Voyeur
diff --git a/engines/voyeur/sound.cpp b/engines/voyeur/sound.cpp
index bf6374fce3..73051211e0 100644
--- a/engines/voyeur/sound.cpp
+++ b/engines/voyeur/sound.cpp
@@ -83,4 +83,8 @@ int SoundManager::getVOCStatus() {
return _mixer->isSoundHandleActive(_soundHandle);
}
+uint32 SoundManager::getVOCFrame() {
+ error("TODO: getVOCFrame");
+}
+
} // End of namespace Voyeur
diff --git a/engines/voyeur/sound.h b/engines/voyeur/sound.h
index a73bd4a753..729a7d9da1 100644
--- a/engines/voyeur/sound.h
+++ b/engines/voyeur/sound.h
@@ -50,6 +50,7 @@ public:
void startVOCPlay(const Common::String &filename);
void startVOCPlay(int soundId);
int getVOCStatus();
+ uint32 getVOCFrame();
};
} // End of namespace Voyeur
diff --git a/engines/voyeur/voyeur.cpp b/engines/voyeur/voyeur.cpp
index c70bb20f4b..b4e8f94d22 100644
--- a/engines/voyeur/voyeur.cpp
+++ b/engines/voyeur/voyeur.cpp
@@ -452,7 +452,6 @@ void VoyeurEngine::showTitleScreen() {
}
void VoyeurEngine::doOpening() {
- /*
_graphicsManager.screenReset();
if (!_bVoy->getBoltGroup(0x200, true))
@@ -461,8 +460,9 @@ void VoyeurEngine::doOpening() {
byte *frameTable = _bVoy->memberAddr(0x215);
byte *xyTable = _bVoy->memberAddr(0x216);
byte *whTable = _bVoy->memberAddr(0x217);
- int frmaeIndex = 0;
+ int frameIndex = 0;
int creditShow = 1;
+ warning("TODO: %x %x %x %d %d", frameTable, xyTable, whTable, creditShow, frameIndex);
_voy._vocSecondsOffset = 0;
_voy._RTVNum = 0;
@@ -472,7 +472,7 @@ void VoyeurEngine::doOpening() {
_gameMinute = 0;
_videoId = 1;
_eventsManager._videoDead = -1;
- _eventsManager.addVideoEventStart();
+ _voy.addVideoEventStart();
_voy._field478 &= ~1;
@@ -483,7 +483,7 @@ void VoyeurEngine::doOpening() {
_eventsManager._intPtr._hasPalette = true;
(*_graphicsManager._vPort)->setupViewPort();
flipPageAndWait();
-
+ /*
::Video::RL2Decoder decoder;
decoder.loadFile("a2300100.rl2");
decoder.start();
@@ -504,16 +504,16 @@ void VoyeurEngine::doOpening() {
_eventsManager.pollEvents();
g_system->delayMillis(10);
}
+ */
if ((_voy._RTVNum - _voy._field468) < 2)
_eventsManager.delay(60);
_voy._field478 |= 1;
- _eventsManager.addVideoEventEnd();
+ _voy.addVideoEventEnd();
_voy._field478 &= 0x10;
_bVoy->freeBoltGroup(0x200);
- */
}
void VoyeurEngine::playRL2Video(const Common::String &filename) {
diff --git a/engines/voyeur/voyeur_game.cpp b/engines/voyeur/voyeur_game.cpp
index 3178ccd087..d57f9a6732 100644
--- a/engines/voyeur/voyeur_game.cpp
+++ b/engines/voyeur/voyeur_game.cpp
@@ -415,10 +415,10 @@ void VoyeurEngine::doPiracy() {
void VoyeurEngine::reviewTape() {
// int var22 = 0;
- int si = 0;
+ int eventStart = 0;
int newX = -1;
int newY = -1;
- int var20 = 7;
+ int eventLine = 7;
Common::Rect tempRect(58, 30, 58 + 223, 30 + 124);
Common::Point pt;
int evtIndex = 0;
@@ -428,10 +428,10 @@ void VoyeurEngine::reviewTape() {
PictureResource *cursor = _bVoy->boltEntry(0x903)._picResource;
if ((_voy._eventCount - 8) != 0)
- si = MAX(_voy._eventCount - 8, 0);
+ eventStart = MAX(_voy._eventCount - 8, 0);
- if ((si + _voy._eventCount) <= 7)
- var20 = si + _voy._eventCount - 1;
+ if ((eventStart + _voy._eventCount) <= 7)
+ eventLine = eventStart + _voy._eventCount - 1;
_voy._viewBounds = _bVoy->boltEntry(0x907)._rectResource;
Common::Array<Common::Rect> &hotspots = _bVoy->boltEntry(0x906)._rectResource->_entries;
@@ -485,22 +485,20 @@ void VoyeurEngine::reviewTape() {
_graphicsManager._drawPtr->_pos = Common::Point(tempRect.left, tempRect.top);
_graphicsManager._backgroundPage->sFillBox(tempRect.width(), tempRect.height());
- newX = si;
int yp = 45;
- evtIndex = si;
- for (int idx = 0; idx < 8 && evtIndex < _voy._eventCount; ++idx) {
+ evtIndex = eventStart;
+ for (int lineNum = 0; lineNum < 8 && evtIndex < _voy._eventCount; ++lineNum) {
_graphicsManager._fontPtr->_picFlags = 0;
_graphicsManager._fontPtr->_picSelect = 0xff;
_graphicsManager._fontPtr->_picPick = 7;
- _graphicsManager._fontPtr->_picOnOff = (idx == var20) ? 8 : 0;
+ _graphicsManager._fontPtr->_picOnOff = (lineNum == eventLine) ? 8 : 0;
_graphicsManager._fontPtr->_pos = Common::Point(68, yp);
_graphicsManager._fontPtr->_justify = ALIGN_LEFT;
_graphicsManager._fontPtr->_justifyWidth = 0;
_graphicsManager._fontPtr->_justifyHeight = 0;
Common::String msg = _eventsManager.getEvidString(evtIndex);
- // TODO: Does drawText need to work on picture resources?
- ((ViewPortResource *)_graphicsManager._backgroundPage)->drawText(msg);
+ _graphicsManager._backgroundPage->drawText(msg);
yp += 15;
++evtIndex;
@@ -533,7 +531,7 @@ void VoyeurEngine::reviewTape() {
if (tempPos.x >= 68 && tempPos.x <= 277 && tempPos.y >= 31 && tempPos.y <= 154) {
tempPos.y -= 2;
foundIndex = (tempPos.y - 31) / 15;
- if ((tempPos.y - 31) % 15 >= 12 || (si + foundIndex) >= _voy._eventCount) {
+ if ((tempPos.y - 31) % 15 >= 12 || (eventStart + foundIndex) >= _voy._eventCount) {
_eventsManager.setCursorColor(128, 0);
foundIndex = 999;
} else if (!_eventsManager._leftClick) {
@@ -541,7 +539,7 @@ void VoyeurEngine::reviewTape() {
foundIndex = 999;
} else {
_eventsManager.setCursorColor(128, 2);
- var20 = foundIndex;
+ eventLine = foundIndex;
flipPageAndWait();
@@ -549,22 +547,21 @@ void VoyeurEngine::reviewTape() {
_graphicsManager._drawPtr->_pos = Common::Point(tempRect.left, tempRect.top);
_graphicsManager._backgroundPage->sFillBox(tempRect.width(), tempRect.height());
- evtIndex = si;
+ evtIndex = eventStart;
int yp = 45;
for (int idx = 0; idx < 8 && evtIndex < _voy._eventCount; ++idx) {
_graphicsManager._fontPtr->_picFlags = 0;
_graphicsManager._fontPtr->_picSelect = 0xff;
_graphicsManager._fontPtr->_picPick = 7;
- _graphicsManager._fontPtr->_picOnOff = (idx == var20) ? 8 : 0;
+ _graphicsManager._fontPtr->_picOnOff = (idx == eventLine) ? 8 : 0;
_graphicsManager._fontPtr->_pos = Common::Point(68, yp);
_graphicsManager._fontPtr->_justify = ALIGN_LEFT;
_graphicsManager._fontPtr->_justifyWidth = 0;
_graphicsManager._fontPtr->_justifyHeight = 0;
Common::String msg = _eventsManager.getEvidString(evtIndex);
- // TODO: Does sFillBox need to work on picture resources?
- ((ViewPortResource *)_graphicsManager._backgroundPage)->drawText(msg);
+ _graphicsManager._backgroundPage->drawText(msg);
yp += 115;
++evtIndex;
@@ -597,36 +594,36 @@ void VoyeurEngine::reviewTape() {
if (_eventsManager._mouseClicked || _eventsManager._mouseUnk) {
switch (foundIndex) {
case 2:
- if (si > 0) {
- --si;
+ if (eventStart > 0) {
+ --eventStart;
var1E = true;
}
foundIndex = -1;
break;
case 3:
- if (si > 0) {
- si -= 8;
- if (si < 0)
- si = 0;
+ if (eventStart > 0) {
+ eventStart -= 8;
+ if (eventStart < 0)
+ eventStart = 0;
var1E = true;
}
foundIndex = -1;
break;
case 4:
- if ((_voy._eventCount - 8) > si) {
- ++si;
+ if ((_voy._eventCount - 8) > eventStart) {
+ ++eventStart;
var1E = true;
}
foundIndex = -1;
break;
case 5:
- if (_voy._eventCount >= 8 && (_voy._eventCount - 8) != si) {
- si += 8;
- if ((_voy._eventCount - 8) < si)
- si = _voy._eventCount - 8;
+ if (_voy._eventCount >= 8 && (_voy._eventCount - 8) != eventStart) {
+ eventStart += 8;
+ if ((_voy._eventCount - 8) < eventStart)
+ eventStart = _voy._eventCount - 8;
var1E = true;
}
foundIndex = -1;
@@ -636,8 +633,8 @@ void VoyeurEngine::reviewTape() {
break;
}
- while (var20 > 0 && (var20 + si) >= _voy._eventCount)
- --var20;
+ while (eventLine > 0 && (eventLine + eventStart) >= _voy._eventCount)
+ --eventLine;
}
pt = _eventsManager.getMousePos();
@@ -653,16 +650,88 @@ void VoyeurEngine::reviewTape() {
} while (!shouldQuit() && (!_eventsManager._mouseClicked || foundIndex == -1));
+ newY = _eventsManager.getMousePos().y;
+ _voy._field437E = 0;
+ _voy._viewBounds = nullptr;
+ (*_graphicsManager._vPort)->setupViewPort(NULL);
+
+ if (_currentVocId != -1) {
+ _voy._vocSecondsOffset = _voy._RTVNum - _voy._field4AC;
+ _soundManager.stopVOCPlay();
+ }
+
+ // Break out if the exit button was pressed
+ if (!foundIndex)
+ break;
+
+ int eventIndex = eventStart + eventLine;
+ VoyeurEvent &e = _voy._events[eventIndex];
+ switch (e._type) {
+ case EVTYPE_VIDEO:
+ playAVideoEvent(eventIndex);
+ break;
+
+ case EVTYPE_AUDIO: {
+ _videoId = e._videoId;
+ _voy._vocSecondsOffset = e._computerOn;
+ _graphicsManager._backgroundPage = _bVoy->boltEntry(0x7F00 +
+ BLIND_TABLE[_videoId])._picResource;
+ _graphicsManager._backColors = _bVoy->boltEntry(0x7F01 +
+ BLIND_TABLE[_videoId])._cMapResource;
+
+ (*_graphicsManager._vPort)->setupViewPort(_graphicsManager._backgroundPage);
+ _graphicsManager._backColors->startFade();
+ flipPageAndWaitForFade();
+
+ _eventsManager._intPtr.field1E = 1;
+ _eventsManager._intPtr.field1A = 0;
+ _voy._field478 &= ~1;
+
+ // Play suond for the given duration
+ _soundManager.setVOCOffset(_voy._vocSecondsOffset * 11025);
+ _soundManager.startVOCPlay(_videoId + 159);
+ uint32 offFrame = e._computerOff;
+
+ while (!_eventsManager._mouseClicked && _soundManager.getVOCStatus() &&
+ _soundManager.getVOCFrame() < offFrame) {
+ _eventsManager.getMouseInfo();
+ _eventsManager.delay(10);
+ }
+
+ _voy._field478 |= 1;
+ _soundManager.stopVOCPlay();
+ _bVoy->freeBoltGroup(0x7F00);
+ break;
+ }
+
+ case EVTYPE_EVID:
+ _bVoy->freeBoltGroup(0x900);
+ _voy.reviewAnEvidEvent(evtIndex);
+
+ _voy._vocSecondsOffset = _voy._RTVNum - _voy._field4AC;
+ _soundManager.stopVOCPlay();
+ _bVoy->getBoltGroup(0x900);
+ break;
+ case EVTYPE_COMPUTER:
+ _bVoy->freeBoltGroup(0x900);
+ _voy.reviewComputerEvent(evtIndex);
+
+ _voy._vocSecondsOffset = _voy._RTVNum - _voy._field4AC;
+ _soundManager.stopVOCPlay();
+ _bVoy->getBoltGroup(0x900);
+ break;
- warning("TODO");
+ default:
+ break;
+ }
}
_graphicsManager._fontPtr->_curFont = _bVoy->boltEntry(0x101)._fontResource;
- _bVoy->freeBoltGroup(0x900);
(*_graphicsManager._vPort)->fillPic(0);
flipPageAndWait();
+ _bVoy->freeBoltGroup(0x900);
}
void VoyeurEngine::doGossip() {
@@ -835,6 +904,21 @@ void VoyeurEngine::playAVideoEvent(int eventIndex) {
_voy._field478 &= ~1;
playAVideoDuration(_videoId, evt._computerOff);
+
+ _voy._field478 |= 1;
+ if (_eventsManager._videoDead != -1) {
+ _bVoy->freeBoltGroup(0xE00);
+ _eventsManager._videoDead = -1;
+ flipPageAndWait();
+ _eventsManager._videoDead = -1;
+ }
+
+ _videoId = -1;
+ if (_eventsManager._videoDead != -1) {
+ _bVoy->freeBoltGroup(0xE00);
+ _eventsManager._videoDead = -1;
+ flipPageAndWait();
+ }
}
int VoyeurEngine::getChooseButton() {