aboutsummaryrefslogtreecommitdiff
path: root/engines/groovie
diff options
context:
space:
mode:
authorScott Thomas2011-04-07 23:36:17 +0930
committerScott Thomas2011-04-07 23:38:35 +0930
commit7c39b844b8f635b8267ce50d22e74090e355ff0e (patch)
tree59e6d10e7f362bb8bb9c5f402f32d69584412bb4 /engines/groovie
parentd718755d73fbacf5ef31159f85a9f822ff7a3f00 (diff)
downloadscummvm-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.cpp10
-rw-r--r--engines/groovie/groovie.h8
-rw-r--r--engines/groovie/player.cpp21
-rw-r--r--engines/groovie/player.h8
-rw-r--r--engines/groovie/script.cpp6
-rw-r--r--engines/groovie/script.h1
-rw-r--r--engines/groovie/vdx.cpp10
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;