[Scummvm-cvs-logs] SF.net SVN: scummvm:[40122] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Fri Apr 24 20:23:19 CEST 2009


Revision: 40122
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40122&view=rev
Author:   drmccoy
Date:     2009-04-24 18:23:17 +0000 (Fri, 24 Apr 2009)

Log Message:
-----------
Added support for SCN-based non-interactive demos

Modified Paths:
--------------
    scummvm/trunk/engines/gob/gob.cpp
    scummvm/trunk/engines/gob/gob.h
    scummvm/trunk/engines/gob/init.cpp
    scummvm/trunk/engines/gob/module.mk

Added Paths:
-----------
    scummvm/trunk/engines/gob/scnplayer.cpp
    scummvm/trunk/engines/gob/scnplayer.h

Modified: scummvm/trunk/engines/gob/gob.cpp
===================================================================
--- scummvm/trunk/engines/gob/gob.cpp	2009-04-24 17:19:20 UTC (rev 40121)
+++ scummvm/trunk/engines/gob/gob.cpp	2009-04-24 18:23:17 UTC (rev 40122)
@@ -96,6 +96,7 @@
 	Common::addDebugChannel(kDebugGraphics, "Graphics", "Graphics debug level");
 	Common::addDebugChannel(kDebugVideo, "Video", "IMD/VMD video debug level");
 	Common::addDebugChannel(kDebugCollisions, "Collisions", "Collisions debug level");
+	Common::addDebugChannel(kDebugSCN, "SCN", "SCN demo script debug level");
 
 	syst->getEventManager()->registerRandomSource(_rnd, "gob");
 }
@@ -171,6 +172,10 @@
 	return (_features & kFeaturesAdlib) != 0;
 }
 
+bool GobEngine::isSCNDemo() const {
+	return (_features & kFeaturesSCNDemo) != 0;
+}
+
 Common::Error GobEngine::run() {
 	if (!initGameParts()) {
 		GUIErrorMessage("GobEngine::init(): Unknown version of game engine");

Modified: scummvm/trunk/engines/gob/gob.h
===================================================================
--- scummvm/trunk/engines/gob/gob.h	2009-04-24 17:19:20 UTC (rev 40121)
+++ scummvm/trunk/engines/gob/gob.h	2009-04-24 18:23:17 UTC (rev 40122)
@@ -104,25 +104,27 @@
 };
 
 enum Features {
-	kFeaturesNone = 0,
-	kFeaturesCD = 1 << 0,
-	kFeaturesEGA = 1 << 1,
-	kFeaturesAdlib = 1 << 2,
-	kFeatures640 = 1 << 3
+	kFeaturesNone    =      0,
+	kFeaturesCD      = 1 << 0,
+	kFeaturesEGA     = 1 << 1,
+	kFeaturesAdlib   = 1 << 2,
+	kFeatures640     = 1 << 3,
+	kFeaturesSCNDemo = 1 << 4
 };
 
 enum {
-	kDebugFuncOp = 1 << 0,
-	kDebugDrawOp = 1 << 1,
-	kDebugGobOp = 1 << 2,
-	kDebugSound = 1 << 3,
-	kDebugParser = 1 << 4,
-	kDebugGameFlow = 1 << 5,
-	kDebugFileIO = 1 << 6,
-	kDebugSaveLoad = 1 << 7,
-	kDebugGraphics = 1 << 8,
-	kDebugVideo = 1 << 9,
-	kDebugCollisions = 1 << 10
+	kDebugFuncOp     = 1 <<  0,
+	kDebugDrawOp     = 1 <<  1,
+	kDebugGobOp      = 1 <<  2,
+	kDebugSound      = 1 <<  3,
+	kDebugParser     = 1 <<  4,
+	kDebugGameFlow   = 1 <<  5,
+	kDebugFileIO     = 1 <<  6,
+	kDebugSaveLoad   = 1 <<  7,
+	kDebugGraphics   = 1 <<  8,
+	kDebugVideo      = 1 <<  9,
+	kDebugCollisions = 1 << 10,
+	kDebugSCN        = 1 << 11
 };
 
 inline char *strncpy0(char *dest, const char *src, size_t n) {
@@ -247,6 +249,7 @@
 	bool isEGA() const;
 	bool is640() const;
 	bool hasAdlib() const;
+	bool isSCNDemo() const;
 
 	GobEngine(OSystem *syst);
 	virtual ~GobEngine();

Modified: scummvm/trunk/engines/gob/init.cpp
===================================================================
--- scummvm/trunk/engines/gob/init.cpp	2009-04-24 17:19:20 UTC (rev 40121)
+++ scummvm/trunk/engines/gob/init.cpp	2009-04-24 18:23:17 UTC (rev 40122)
@@ -36,6 +36,7 @@
 #include "gob/inter.h"
 #include "gob/video.h"
 #include "gob/videoplayer.h"
+#include "gob/scnplayer.h"
 #include "gob/sound/sound.h"
 
 namespace Gob {
@@ -93,6 +94,18 @@
 	for (int i = 0; i < 8; i++)
 		_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");
 
 	if (handle < 0) {

Modified: scummvm/trunk/engines/gob/module.mk
===================================================================
--- scummvm/trunk/engines/gob/module.mk	2009-04-24 17:19:20 UTC (rev 40121)
+++ scummvm/trunk/engines/gob/module.mk	2009-04-24 18:23:17 UTC (rev 40122)
@@ -55,6 +55,7 @@
 	scenery.o \
 	scenery_v1.o \
 	scenery_v2.o \
+	scnplayer.o \
 	util.o \
 	variables.o \
 	video.o \

Added: scummvm/trunk/engines/gob/scnplayer.cpp
===================================================================
--- scummvm/trunk/engines/gob/scnplayer.cpp	                        (rev 0)
+++ scummvm/trunk/engines/gob/scnplayer.cpp	2009-04-24 18:23:17 UTC (rev 40122)
@@ -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


Property changes on: scummvm/trunk/engines/gob/scnplayer.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Added: scummvm/trunk/engines/gob/scnplayer.h
===================================================================
--- scummvm/trunk/engines/gob/scnplayer.h	                        (rev 0)
+++ scummvm/trunk/engines/gob/scnplayer.h	2009-04-24 18:23:17 UTC (rev 40122)
@@ -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


Property changes on: scummvm/trunk/engines/gob/scnplayer.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list