From 487ce6a02c2aab7870dd64b01e25851d11812e87 Mon Sep 17 00:00:00 2001 From: Dmitry Iskrich Date: Mon, 13 Jun 2016 23:07:48 +0300 Subject: DIRECTOR: Read palette info, handle wait sound events --- engines/director/score.cpp | 25 +++++++++++++++++++++---- engines/director/score.h | 10 ++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) (limited to 'engines/director') diff --git a/engines/director/score.cpp b/engines/director/score.cpp index 77cf084bb0..08f881e78c 100644 --- a/engines/director/score.cpp +++ b/engines/director/score.cpp @@ -497,9 +497,17 @@ void Score::update() { } else if (tempo == 128) { //TODO Wait for Click/Key } else if (tempo == 135) { - //TODO Wait for sound channel 1 + //Wait for sound channel 1 + while (_soundManager->isChannelActive(1)) { + processEvents(); + g_system->delayMillis(10); + } } else if (tempo == 134) { - //TODO Wait for sound channel 2 + //Wait for sound channel 2 + while (_soundManager->isChannelActive(2)) { + processEvents(); + g_system->delayMillis(10); + } } } _nextFrameTime = g_system->getMillis() + (float)_currentFrameRate / 60 * 1000; @@ -562,6 +570,7 @@ Frame::Frame(const Frame &frame) { _soundType2 = frame._soundType2; _skipFrameFlag = frame._skipFrameFlag; _blend = frame._blend; + _palette = new PaletteInfo(); _sprites.resize(CHANNEL_COUNT); for (uint16 i = 0; i < CHANNEL_COUNT; i++) { @@ -652,8 +661,8 @@ void Frame::readMainChannels(Common::SeekableReadStream &stream, uint16 offset, offset += 1; break; case kPaletePosition: - //TODO palette channel - stream.skip(16); + if (stream.readUint16LE()) + readPaletteInfo(stream); offset += 16; default: offset++; @@ -663,6 +672,14 @@ void Frame::readMainChannels(Common::SeekableReadStream &stream, uint16 offset, } } } +void Frame::readPaletteInfo(Common::SeekableReadStream &stream) { + _palette->firstColor = stream.readByte(); + _palette->lastColor = stream.readByte(); + _palette->flags = stream.readByte(); + _palette->speed = stream.readByte(); + _palette->frameCount = stream.readUint16LE(); + stream.skip(8); //unknown +} void Frame::readSprite(Common::SeekableReadStream &stream, uint16 offset, uint16 size) { uint16 spritePosition = (offset - 32) / 16; diff --git a/engines/director/score.h b/engines/director/score.h index f9293f078c..944a7e467f 100644 --- a/engines/director/score.h +++ b/engines/director/score.h @@ -213,6 +213,14 @@ struct CastInfo { Common::String type; }; +struct PaletteInfo { + uint8 firstColor; + uint8 lastColor; + uint8 flags; + uint8 speed; + uint16 frameCount; +}; + class Sprite { public: Sprite(); @@ -240,6 +248,7 @@ private: void playTransition(Graphics::ManagedSurface &frameSurface, Common::Rect transRect); void playSoundChannel(); void renderSprites(Archive &_movie, Graphics::ManagedSurface &surface, Common::Rect movieRect, bool renderTrail); + void readPaletteInfo(Common::SeekableReadStream &stream); void readSprite(Common::SeekableReadStream &stream, uint16 offset, uint16 size); void readMainChannels(Common::SeekableReadStream &stream, uint16 offset, uint16 size); void drawBackgndTransSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect); @@ -250,6 +259,7 @@ public: uint8 _transArea; //1 - Whole Stage, 0 - Changing Area uint8 _transChunkSize; transitionType _transType; + PaletteInfo *_palette; uint8 _tempo; uint16 _sound1; -- cgit v1.2.3