aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorLars Skovlund2011-02-03 19:47:36 +0000
committerLars Skovlund2011-02-03 19:47:36 +0000
commit11e2f2226c3f162bf630c0d0b2f8b75537c7e451 (patch)
treec5f19629c61a3171105ad39b4151f405b6d58107 /engines
parent935b3187982afb8a8c1aebded8b5ddc607e27f0f (diff)
downloadscummvm-rg350-11e2f2226c3f162bf630c0d0b2f8b75537c7e451.tar.gz
scummvm-rg350-11e2f2226c3f162bf630c0d0b2f8b75537c7e451.tar.bz2
scummvm-rg350-11e2f2226c3f162bf630c0d0b2f8b75537c7e451.zip
SCI: Robot v6 support. I _think_ this is complete.
svn-id: r55759
Diffstat (limited to 'engines')
-rw-r--r--engines/sci/graphics/robot.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/engines/sci/graphics/robot.cpp b/engines/sci/graphics/robot.cpp
index 9a6bf64909..f45d3cb552 100644
--- a/engines/sci/graphics/robot.cpp
+++ b/engines/sci/graphics/robot.cpp
@@ -141,7 +141,6 @@ void GfxRobot::init(GuiResourceId resourceId, uint16 x, uint16 y) {
// Unsupported
// TODO: Add support for this version
warning("TODO: add support for v6 robot videos");
- _curFrame = _frameCount; // jump to the last frame
break;
default:
// Unsupported, error out so that we find out where this is used
@@ -159,13 +158,28 @@ void GfxRobot::init(GuiResourceId resourceId, uint16 x, uint16 y) {
void GfxRobot::getFrameOffsets() {
int *audioEnd = new int[_frameCount];
int *videoEnd = new int[_frameCount];
+ uint32 frameDataOffset;
- for (int i = 0; i < _frameCount; ++i) {
- videoEnd[i] = READ_LE_UINT16(_resourceData + _palOffset + 1200 + i * 2);
- audioEnd[i] = READ_LE_UINT16(_resourceData + _palOffset + 1200 + _frameCount * 2 + i * 2);
+ switch (_version) {
+ case 5:
+ for (int i = 0; i < _frameCount; ++i) {
+ videoEnd[i] = READ_LE_UINT16(_resourceData + _palOffset + 1200 + i * 2);
+ audioEnd[i] = READ_LE_UINT16(_resourceData + _palOffset + 1200 + _frameCount * 2 + i * 2);
+ }
+ frameDataOffset = _palOffset + 0x4b0 + 0x400 + 0x200 + _frameCount * 4;
+ break;
+ case 6:
+ for (int i = 0; i < _frameCount; ++i) {
+ videoEnd[i] = READ_LE_UINT32(_resourceData + _palOffset + 1200 + i * 4);
+ audioEnd[i] = READ_LE_UINT32(_resourceData + _palOffset + 1200 + _frameCount * 4 + i * 4);
+ }
+ frameDataOffset = _palOffset + 0x4b0 + 0x400 + 0x200 + _frameCount * 8;
+ break;
+ default:
+ error("Can't yet handle index table for robot version %d", _version);
+ return;
}
- uint32 frameDataOffset = _palOffset + 0x4b0 + 0x400 + 0x200 + _frameCount * 4;
// Pad to nearest 2 kilobytes
if (frameDataOffset & 0x7ff)
@@ -250,8 +264,6 @@ void GfxRobot::drawNextFrame() {
void GfxRobot::assembleVideoFrame(uint16 frame) {
byte *videoData = _resourceData + _imageStart[frame];
- uint16 frameWidth = READ_LE_UINT16(videoData + 4);
- uint16 frameHeight = READ_LE_UINT16(videoData + 6);
uint16 frameFragments = READ_LE_UINT16(videoData + 18);
uint32 decompressedSize = 0;
@@ -268,7 +280,10 @@ void GfxRobot::assembleVideoFrame(uint16 frame) {
videoData += 10 + fragmentCompressed;
}
- assert(decompressedSize == (uint32)(frameWidth * frameHeight) * getFrameScale(frame) / 100);
+ // Causes assertions in various places, such as Lighthouse/Demo 693.RBT
+ // uint16 frameWidth = READ_LE_UINT16(_resourceData + _imageStart[frame] + 4);
+ // uint16 frameHeight = READ_LE_UINT16(_resourceData + _imageStart[frame] + 6);
+ // assert(decompressedSize == (uint32)(frameWidth * frameHeight) * getFrameScale(frame) / 100);
// Reallocate the output buffer, if its size has changed
if (decompressedSize != _outputBufferSize) {