Added support for SCN-based non-interactive demos

svn-id: r40122
This commit is contained in:
Sven Hesse 2009-04-24 18:23:17 +00:00
parent 7d4618d165
commit 893a3fc7e2
6 changed files with 251 additions and 16 deletions

View file

@ -96,6 +96,7 @@ GobEngine::GobEngine(OSystem *syst) : Engine(syst) {
Common::addDebugChannel(kDebugGraphics, "Graphics", "Graphics debug level"); Common::addDebugChannel(kDebugGraphics, "Graphics", "Graphics debug level");
Common::addDebugChannel(kDebugVideo, "Video", "IMD/VMD video debug level"); Common::addDebugChannel(kDebugVideo, "Video", "IMD/VMD video debug level");
Common::addDebugChannel(kDebugCollisions, "Collisions", "Collisions debug level"); Common::addDebugChannel(kDebugCollisions, "Collisions", "Collisions debug level");
Common::addDebugChannel(kDebugSCN, "SCN", "SCN demo script debug level");
syst->getEventManager()->registerRandomSource(_rnd, "gob"); syst->getEventManager()->registerRandomSource(_rnd, "gob");
} }
@ -171,6 +172,10 @@ bool GobEngine::hasAdlib() const {
return (_features & kFeaturesAdlib) != 0; return (_features & kFeaturesAdlib) != 0;
} }
bool GobEngine::isSCNDemo() const {
return (_features & kFeaturesSCNDemo) != 0;
}
Common::Error GobEngine::run() { Common::Error GobEngine::run() {
if (!initGameParts()) { if (!initGameParts()) {
GUIErrorMessage("GobEngine::init(): Unknown version of game engine"); GUIErrorMessage("GobEngine::init(): Unknown version of game engine");

View file

@ -108,7 +108,8 @@ enum Features {
kFeaturesCD = 1 << 0, kFeaturesCD = 1 << 0,
kFeaturesEGA = 1 << 1, kFeaturesEGA = 1 << 1,
kFeaturesAdlib = 1 << 2, kFeaturesAdlib = 1 << 2,
kFeatures640 = 1 << 3 kFeatures640 = 1 << 3,
kFeaturesSCNDemo = 1 << 4
}; };
enum { enum {
@ -122,7 +123,8 @@ enum {
kDebugSaveLoad = 1 << 7, kDebugSaveLoad = 1 << 7,
kDebugGraphics = 1 << 8, kDebugGraphics = 1 << 8,
kDebugVideo = 1 << 9, kDebugVideo = 1 << 9,
kDebugCollisions = 1 << 10 kDebugCollisions = 1 << 10,
kDebugSCN = 1 << 11
}; };
inline char *strncpy0(char *dest, const char *src, size_t n) { inline char *strncpy0(char *dest, const char *src, size_t n) {
@ -247,6 +249,7 @@ public:
bool isEGA() const; bool isEGA() const;
bool is640() const; bool is640() const;
bool hasAdlib() const; bool hasAdlib() const;
bool isSCNDemo() const;
GobEngine(OSystem *syst); GobEngine(OSystem *syst);
virtual ~GobEngine(); virtual ~GobEngine();

View file

@ -36,6 +36,7 @@
#include "gob/inter.h" #include "gob/inter.h"
#include "gob/video.h" #include "gob/video.h"
#include "gob/videoplayer.h" #include "gob/videoplayer.h"
#include "gob/scnplayer.h"
#include "gob/sound/sound.h" #include "gob/sound/sound.h"
namespace Gob { namespace Gob {
@ -93,6 +94,18 @@ void Init::initGame() {
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
_vm->_draw->_fonts[i] = 0; _vm->_draw->_fonts[i] = 0;
if (_vm->isSCNDemo()) {
// This is a non-interactive demo with a SCN script and VMD videos
SCNPlayer scnPlayer(_vm);
bool ret = scnPlayer.play(_vm->_startTot);
warning("Played: %d", ret);
return;
}
handle = _vm->_dataIO->openData("intro.inf"); handle = _vm->_dataIO->openData("intro.inf");
if (handle < 0) { if (handle < 0) {

View file

@ -55,6 +55,7 @@ MODULE_OBJS := \
scenery.o \ scenery.o \
scenery_v1.o \ scenery_v1.o \
scenery_v2.o \ scenery_v2.o \
scnplayer.o \
util.o \ util.o \
variables.o \ variables.o \
video.o \ video.o \

152
engines/gob/scnplayer.cpp Normal file
View file

@ -0,0 +1,152 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*
*/
#include "common/endian.h"
#include "gob/gob.h"
#include "gob/scnplayer.h"
#include "gob/util.h"
#include "gob/draw.h"
#include "gob/inter.h"
#include "gob/videoplayer.h"
namespace Gob {
SCNPlayer::SCNPlayer(GobEngine *vm) : _vm(vm) {
}
SCNPlayer::~SCNPlayer() {
}
inline bool SCNPlayer::lineStartsWith(const Common::String &line, const char *start) {
return (strstr(line.c_str(), start) == line.c_str());
}
bool SCNPlayer::play(const char *fileName) {
debugC(1, kDebugSCN, "Playing SCN \"%s\"", fileName);
// The video player needs some fake variables
_vm->_inter->allocateVars(32);
// Init the screen
_vm->_draw->initScreen();
_vm->_draw->_cursorIndex = -1;
_vm->_util->longDelay(200); // Letting everything settle
Common::File scn;
if (!scn.open(fileName))
return false;
return play(scn);
}
bool SCNPlayer::play(Common::File &scn) {
// Read labels
LabelMap labels;
if (!readLabels(scn, labels))
return false;
// Iterate over all lines
while (!scn.err() && !scn.eos()) {
Common::String line = scn.readLine();
// Interpret
if (line == "CLEAR") {
clearScreen();
} else if (lineStartsWith(line, "IMD_PRELOAD ")) {
playVideo(line.c_str() + 12);
} else if (lineStartsWith(line, "GOTO ")) {
gotoLabel(scn, labels, line.c_str() + 5);
}
// Mind user input
_vm->_util->processInput();
if (_vm->shouldQuit())
return true;
}
if (scn.err())
return false;
return true;
}
bool SCNPlayer::readLabels(Common::File &scn, LabelMap &labels) {
debugC(1, kDebugSCN, "Reading SCN labels");
int32 startPos = scn.pos();
// Iterate over all lines
while (!scn.err() && !scn.eos()) {
Common::String line = scn.readLine();
if (lineStartsWith(line, "LABEL ")) {
// Label => Add to the hashmap
labels.setVal(line.c_str() + 6, scn.pos());
debugC(2, kDebugSCN, "Found label \"%s\" (%d)", line.c_str() + 6, scn.pos());
}
}
if (scn.err())
return false;
// Seek back
if (!scn.seek(startPos))
return false;
return true;
}
void SCNPlayer::gotoLabel(Common::File &scn, const LabelMap &labels, const char *label) {
debugC(2, kDebugSCN, "Jumping to label \"%s\"", label);
if (!labels.contains(label))
return;
scn.seek(labels.getVal(label));
}
void SCNPlayer::clearScreen() {
debugC(1, kDebugSCN, "Clearing the screen");
_vm->_video->clearScreen();
}
void SCNPlayer::playVideo(const char *fileName) {
// Trimming spaces
while (*fileName == ' ')
fileName++;
debugC(1, kDebugSCN, "Playing video \"%s\"", fileName);
// Playing the video
if (_vm->_vidPlayer->primaryOpen(fileName)) {
_vm->_vidPlayer->primaryPlay();
_vm->_vidPlayer->primaryClose();
}
}
} // End of namespace Gob

61
engines/gob/scnplayer.h Normal file
View file

@ -0,0 +1,61 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*
*/
#ifndef GOB_SCNPLAYER_H
#define GOB_SCNPLAYER_H
#include "common/file.h"
#include "common/str.h"
#include "common/hashmap.h"
namespace Gob {
class GobEngine;
class SCNPlayer {
public:
SCNPlayer(GobEngine *vm);
~SCNPlayer();
bool play(const char *fileName);
private:
typedef Common::HashMap<Common::String, int32, Common::CaseSensitiveString_Hash, Common::CaseSensitiveString_EqualTo> LabelMap;
GobEngine *_vm;
bool play(Common::File &scn);
bool readLabels(Common::File &scn, LabelMap &labels);
inline bool lineStartsWith(const Common::String &line, const char *start);
void gotoLabel(Common::File &scn, const LabelMap &labels, const char *label);
void clearScreen();
void playVideo(const char *fileName);
};
} // End of namespace Gob
#endif // GOB_SCNPLAYER_H