diff options
author | Scott Thomas | 2011-04-07 23:36:17 +0930 |
---|---|---|
committer | Scott Thomas | 2011-04-07 23:38:35 +0930 |
commit | 7c39b844b8f635b8267ce50d22e74090e355ff0e (patch) | |
tree | 59e6d10e7f362bb8bb9c5f402f32d69584412bb4 /engines/groovie | |
parent | d718755d73fbacf5ef31159f85a9f822ff7a3f00 (diff) | |
download | scummvm-rg350-7c39b844b8f635b8267ce50d22e74090e355ff0e.tar.gz scummvm-rg350-7c39b844b8f635b8267ce50d22e74090e355ff0e.tar.bz2 scummvm-rg350-7c39b844b8f635b8267ce50d22e74090e355ff0e.zip |
GROOVIE: Add additional play-speed modes to T7G.
These two speed modes enable faster movement throughout the mansion.
iOS mode matches the behavior of the official iOS release while
tweaked mode additionally uses original framerate for 'teeth'
animations.
Diffstat (limited to 'engines/groovie')
-rw-r--r-- | engines/groovie/groovie.cpp | 10 | ||||
-rw-r--r-- | engines/groovie/groovie.h | 8 | ||||
-rw-r--r-- | engines/groovie/player.cpp | 21 | ||||
-rw-r--r-- | engines/groovie/player.h | 8 | ||||
-rw-r--r-- | engines/groovie/script.cpp | 6 | ||||
-rw-r--r-- | engines/groovie/script.h | 1 | ||||
-rw-r--r-- | engines/groovie/vdx.cpp | 10 |
7 files changed, 58 insertions, 6 deletions
diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 67c8f3dbc7..ea9c0a9fb7 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -55,6 +55,16 @@ GroovieEngine::GroovieEngine(OSystem *syst, const GroovieGameDescription *gd) : SearchMan.addSubDirectoryMatching(gameDataDir, "media"); SearchMan.addSubDirectoryMatching(gameDataDir, "system"); + _modeSpeed = kGroovieSpeedNormal; + if (ConfMan.hasKey("t7g_speed")) + { + Common::String speed = ConfMan.get("t7g_speed"); + if (speed.equals("im_an_ios")) + _modeSpeed = kGroovieSpeediOS; + else if (speed.equals("tweaked")) + _modeSpeed = kGroovieSpeedTweaked; + } + // Initialize the custom debug levels DebugMan.addDebugChannel(kGroovieDebugAll, "All", "Debug everything"); DebugMan.addDebugChannel(kGroovieDebugVideo, "Video", "Debug video and audio playback"); diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h index f8fad8d91f..bd376db0d2 100644 --- a/engines/groovie/groovie.h +++ b/engines/groovie/groovie.h @@ -75,6 +75,12 @@ enum DebugLevels { // the current limitation is 32 debug levels (1 << 31 is the last one) }; +enum GameSpeed { + kGroovieSpeedNormal, + kGroovieSpeediOS, + kGroovieSpeedTweaked +}; + struct GroovieGameDescription; class GroovieEngine : public Engine { @@ -113,6 +119,8 @@ public: Common::MacResManager *_macResFork; + GameSpeed _modeSpeed; + private: const GroovieGameDescription *_gameDescription; Debugger *_debugger; diff --git a/engines/groovie/player.cpp b/engines/groovie/player.cpp index 8badd90012..4b8ae0083f 100644 --- a/engines/groovie/player.cpp +++ b/engines/groovie/player.cpp @@ -29,18 +29,19 @@ namespace Groovie { VideoPlayer::VideoPlayer(GroovieEngine *vm) : - _vm(vm), _syst(vm->_system), _file(NULL), _audioStream(NULL) { + _vm(vm), _syst(vm->_system), _file(NULL), _audioStream(NULL), _fps(0), _overrideSpeed(false) { } bool VideoPlayer::load(Common::SeekableReadStream *file, uint16 flags) { _file = file; _flags = flags; + _overrideSpeed = false; _audioStream = NULL; - uint16 fps = loadInternal(); + _fps = loadInternal(); - if (fps != 0) { - _millisBetweenFrames = 1000 / fps; + if (_fps != 0) { + setOverrideSpeed(_overrideSpeed); _begunPlaying = false; return true; } else { @@ -49,6 +50,18 @@ bool VideoPlayer::load(Common::SeekableReadStream *file, uint16 flags) { } } +void VideoPlayer::setOverrideSpeed(bool isOverride) +{ + _overrideSpeed = isOverride; + if (_fps != 0) + { + if (isOverride) + _millisBetweenFrames = 1000 / 26; + else + _millisBetweenFrames = 1000 / _fps; + } +} + bool VideoPlayer::playFrame() { bool end = true; diff --git a/engines/groovie/player.h b/engines/groovie/player.h index c9f47b8100..e75a5fc3c0 100644 --- a/engines/groovie/player.h +++ b/engines/groovie/player.h @@ -48,15 +48,21 @@ protected: virtual uint16 loadInternal() = 0; virtual bool playFrameInternal() = 0; + void setOverrideSpeed(bool isOverride); + bool getOverrideSpeed() const { return _overrideSpeed; } + GroovieEngine *_vm; OSystem *_syst; Common::SeekableReadStream *_file; uint16 _flags; Audio::QueuingAudioStream *_audioStream; - + + private: // Synchronization stuff bool _begunPlaying; + bool _overrideSpeed; + uint16 _fps; uint16 _millisBetweenFrames; uint32 _lastFrameTime; diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp index 4abfff74f2..782391dd78 100644 --- a/engines/groovie/script.cpp +++ b/engines/groovie/script.cpp @@ -65,7 +65,7 @@ static void debugScript(int level, bool nl, const char *s, ...) { Script::Script(GroovieEngine *vm, EngineVersion version) : _code(NULL), _savedCode(NULL), _stacktop(0), _debugger(NULL), _vm(vm), - _videoFile(NULL), _videoRef(0), _staufsMove(NULL) { + _videoFile(NULL), _videoRef(0), _staufsMove(NULL), _lastCursor(0xff) { // Initialize the opcode set depending on the engine version switch (version) { case kGroovieT7G: @@ -387,6 +387,7 @@ bool Script::hotspot(Common::Rect rect, uint16 address, uint8 cursor) { // If clicked with the mouse, jump to the specified address if (_mouseClicked) { + _lastCursor = cursor; _inputAction = address; } } @@ -579,11 +580,14 @@ bool Script::playvideofromref(uint32 fileref) { if (_videoFile) { _videoRef = fileref; + if (_lastCursor == 7) + _bitflags |= (1 << 15); _vm->_videoPlayer->load(_videoFile, _bitflags); } else { error("Couldn't open file"); return true; } + _lastCursor = 0xff; _bitflags = 0; diff --git a/engines/groovie/script.h b/engines/groovie/script.h index cda87a8917..2360d45744 100644 --- a/engines/groovie/script.h +++ b/engines/groovie/script.h @@ -75,6 +75,7 @@ private: Common::RandomSource _random; bool _firstbit; + uint8 _lastCursor; // Script filename (for debugging purposes) Common::String _scriptFile; diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp index 1b4a2b7800..5569ae92ca 100644 --- a/engines/groovie/vdx.cpp +++ b/engines/groovie/vdx.cpp @@ -86,6 +86,11 @@ uint16 VDXPlayer::loadInternal() { _flagEight = ((_flags & (1 << 8)) != 0); _flagNine = ((_flags & (1 << 9)) != 0); + // Enable highspeed if we're not obeying fps, and not marked as special + // This will be disabled in chunk audio if we're actually an audio vdx + if ( _vm->_modeSpeed == kGroovieSpeediOS || (_vm->_modeSpeed == kGroovieSpeedTweaked && ((_flags & (1 << 15)) == 0))) + setOverrideSpeed(true); + if (_flagOnePrev && !_flagOne && !_flagEight) { _flagSeven = true; } @@ -522,6 +527,11 @@ void VDXPlayer::decodeBlockDelta(uint32 offset, byte *colours, uint16 imageWidth } void VDXPlayer::chunkSound(Common::ReadStream *in) { + if (getOverrideSpeed()) + { + setOverrideSpeed(false); + } + if (!_audioStream) { _audioStream = Audio::makeQueuingAudioStream(22050, false); Audio::SoundHandle sound_handle; |