Added support for SCN-based non-interactive demos
svn-id: r40122
This commit is contained in:
parent
7d4618d165
commit
893a3fc7e2
6 changed files with 251 additions and 16 deletions
|
@ -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");
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
152
engines/gob/scnplayer.cpp
Normal 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
61
engines/gob/scnplayer.h
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue