From fcbee4f724b5028cd1778aff375031b56b50dc40 Mon Sep 17 00:00:00 2001 From: Martin Gerhardy Date: Sat, 6 Feb 2021 14:20:26 +0100 Subject: [PATCH] TWINE: fla disassembly findings looks like they are unused in the fla movies that i've tried so far... --- engines/twine/flamovies.cpp | 71 ++++++++++++++++++++++++++++--------- engines/twine/flamovies.h | 1 + 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/engines/twine/flamovies.cpp b/engines/twine/flamovies.cpp index 3b3b50584b0..4645f7b63ca 100644 --- a/engines/twine/flamovies.cpp +++ b/engines/twine/flamovies.cpp @@ -36,12 +36,16 @@ namespace TwinE { /** FLA Frame Opcode types */ enum FlaFrameOpcode { - kLoadPalette = 0, - kFade = 1, - kPlaySample = 2, - kStopSample = 4, - kDeltaFrame = 5, - kKeyFrame = 7 + kLoadPalette = 1, + kFade = 2, + kPlaySample = 3, + kFlaUnknown4 = 4, + kStopSample = 5, + kDeltaFrame = 6, + kFlaUnknown7 = 7, + kKeyFrame = 8, + kFlaUnknown9 = 9, + kFlaUnknown16SameAs9 = 16 }; /** FLA movie sample structure */ @@ -172,12 +176,11 @@ void FlaMovies::processFrame() { Common::MemoryReadStream stream(outBuf, frameData.frameVar0); for (int32 frame = 0; frame < frameData.videoSize; ++frame) { - const uint8 opcode = stream.readByte(); - stream.skip(1); - const uint32 opcodeBlockSize = stream.readUint16LE(); + const uint16 opcode = stream.readUint16LE(); + const uint16 opcodeBlockSize = stream.readUint16LE(); const int32 pos = stream.pos(); - switch (opcode - 1) { + switch (opcode) { case kLoadPalette: { int16 numOfColor = stream.readSint16LE(); int16 startColor = stream.readSint16LE(); @@ -186,12 +189,25 @@ void FlaMovies::processFrame() { break; } case kFade: { - // FLA movies don't use cross fade - // fade out tricky - if (_fadeOut != 1) { - _engine->_screens->convertPalToRGBA(_engine->_screens->palette, _engine->_screens->paletteRGBACustom); - _engine->_screens->fadeToBlack(_engine->_screens->paletteRGBACustom); - _fadeOut = 1; + int16 innerOpcpde = stream.readSint16LE(); + switch (innerOpcpde) { + case 1: + _engine->_music->playMidiMusic(26); + break; + case 2: + // FLA movies don't use cross fade + // fade out tricky + if (_fadeOut != 1) { + _engine->_screens->convertPalToRGBA(_engine->_screens->palette, _engine->_screens->paletteRGBACustom); + _engine->_screens->fadeToBlack(_engine->_screens->paletteRGBACustom); + _fadeOut = 1; + } + break; + case 3: + _flaPaletteVar = true; + break; + case 4: + _engine->_music->stopMidiMusic(); } break; } @@ -220,6 +236,28 @@ void FlaMovies::processFrame() { drawKeyFrame(stream, FLASCREEN_WIDTH, FLASCREEN_HEIGHT); break; } + case kFlaUnknown7: { + byte *ptr = (byte *)_engine->frontVideoBuffer.getPixels(); + for (int y = 0; y < 200; ++y) { + for (int x = 0; x < 80; ++x) { + *ptr++ = 0; + } + ptr = ptr + 80; + } + break; + } + case kFlaUnknown9: + case kFlaUnknown16SameAs9: { + byte *ptr = (byte *)_engine->frontVideoBuffer.getPixels(); + for (int y = 0; y < 200; ++y) { + for (int x = 0; x < 80; ++x) { + *ptr++ = stream.readByte(); + } + ptr = ptr + 80; + } + break; + } + case kFlaUnknown4: default: { break; } @@ -348,6 +386,7 @@ void FlaMovies::playFlaMovie(const char *flaName) { ScopedKeyMap scopedKeyMap(_engine, cutsceneKeyMapId); + _flaPaletteVar = true; do { FrameMarker frame; ScopedFPS scopedFps(flaHeaderData.speed); diff --git a/engines/twine/flamovies.h b/engines/twine/flamovies.h index c3cdf56e9d6..be76a8f27d2 100644 --- a/engines/twine/flamovies.h +++ b/engines/twine/flamovies.h @@ -72,6 +72,7 @@ private: int32 _fadeOut = 0; /** Auxiliar FLA fade out variable to count frames between the fade */ int32 fadeOutFrames = 0; + bool _flaPaletteVar = false; /** FLA movie file buffer */ uint8 flaBuffer[FLASCREEN_WIDTH * FLASCREEN_HEIGHT] {0};