[Scummvm-cvs-logs] SF.net SVN: scummvm:[42211] scummvm/trunk/engines/sci

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Tue Jul 7 12:28:06 CEST 2009


Revision: 42211
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42211&view=rev
Author:   thebluegr
Date:     2009-07-07 10:28:05 +0000 (Tue, 07 Jul 2009)

Log Message:
-----------
Added auto-detection for games with older headers for script blocks, and removed game flag GF_SCI0_OLD

Modified Paths:
--------------
    scummvm/trunk/engines/sci/detection.cpp
    scummvm/trunk/engines/sci/engine/game.cpp
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kernel.h
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/engine/savegame.cpp
    scummvm/trunk/engines/sci/engine/scriptdebug.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp
    scummvm/trunk/engines/sci/engine/vm.h
    scummvm/trunk/engines/sci/sci.cpp
    scummvm/trunk/engines/sci/sci.h

Modified: scummvm/trunk/engines/sci/detection.cpp
===================================================================
--- scummvm/trunk/engines/sci/detection.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/detection.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -31,7 +31,6 @@
 
 namespace Sci {
 
-#define GF_FOR_SCI0_BEFORE_395 (GF_SCI0_OLD | GF_SCI0_OLDGETTIME)
 #define GF_FOR_SCI0_BEFORE_629 GF_SCI0_OLDGETTIME
 
 // Titles of the games
@@ -219,7 +218,7 @@
 		{"resource.map", 0, "39485580d34a72997f3d5b3aba4d24f1", 426},
 		{"resource.001", 0, "11391434f41c834090d7a1e9488ce936", 129739},
 		{NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH},
-		GF_FOR_SCI0_BEFORE_395,
+		GF_FOR_SCI0_BEFORE_629,
 		SCI_VERSION_AUTODETECT,
 		SCI_VERSION_0
 	},
@@ -1032,7 +1031,7 @@
 		{"resource.006", 0, "851a62d00972dc4002f472cc0d84e71d", 333777},
 		{"resource.007", 0, "851a62d00972dc4002f472cc0d84e71d", 341038},
 		{NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH},
-		GF_FOR_SCI0_BEFORE_395,
+		GF_FOR_SCI0_BEFORE_629,
 		SCI_VERSION_AUTODETECT,
 		SCI_VERSION_0
 	},
@@ -1049,7 +1048,7 @@
 		{"resource.006", 0, "0c8566848a76eea19a6d6220914030a7", 337288},
 		{"resource.007", 0, "0c8566848a76eea19a6d6220914030a7", 343882},
 		{NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH},
-		GF_FOR_SCI0_BEFORE_395,
+		GF_FOR_SCI0_BEFORE_629,
 		SCI_VERSION_AUTODETECT,
 		SCI_VERSION_0
 	},
@@ -1616,7 +1615,7 @@
 		{"resource.005", 0, "96033f57accfca903750413fd09193c8", 274953},
 		{"resource.006", 0, "96033f57accfca903750413fd09193c8", 345818},
 		{NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH},
-		GF_FOR_SCI0_BEFORE_395,
+		GF_FOR_SCI0_BEFORE_629,
 		SCI_VERSION_AUTODETECT,
 		SCI_VERSION_0
 	},

Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/game.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -257,7 +257,7 @@
 		Resource *script = s->resmgr->findResource(ResourceId(kResourceTypeScript, scriptnr), 0);
 
 		if (script) {
-			if (s->_flags & GF_SCI0_OLD)
+			if (s->_kernel->hasOldScriptHeader())
 				magic_offset = seeker = 2;
 			else
 				magic_offset = seeker = 0;
@@ -327,6 +327,9 @@
 
 	s->kernel_opt_flags = 0;
 
+	s->_kernel = new Kernel(s->resmgr);
+	s->_vocabulary = new Vocabulary(s->resmgr);
+
 	if (s->_version >= SCI_VERSION_1_1)
 		result = create_class_table_sci11(s);
 	else
@@ -367,9 +370,6 @@
 	s->_executionStack.clear();    // Start without any execution stack
 	s->execution_stack_base = -1; // No vm is running yet
 
-	s->_kernel = new Kernel(s->resmgr, (s->_flags & GF_SCI0_OLD));
-	s->_vocabulary = new Vocabulary(s->resmgr);
-
 	s->restarting_flags = SCI_GAME_IS_NOT_RESTARTING;
 
 	s->bp_list = NULL; // No breakpoints defined

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -367,10 +367,11 @@
 	"Arithmetic"
 };
 
-Kernel::Kernel(ResourceManager *resmgr, bool isOldSci0) : _resmgr(resmgr) {
+Kernel::Kernel(ResourceManager *resmgr) : _resmgr(resmgr) {
 	memset(&_selectorMap, 0, sizeof(_selectorMap));	// FIXME: Remove this once/if we C++ify selector_map_t
 
-	loadSelectorNames(isOldSci0);
+	detectOldScriptHeader();	// must be called before loadSelectorNames()
+	loadSelectorNames();
 	mapSelectors();     // Map a few special selectors for later use
 	loadOpcodes();
 	loadKernelNames();
@@ -390,6 +391,11 @@
 }
 
 void Kernel::printAutoDetectedFeatures() {
+	if (_oldScriptHeader)
+		printf("Kernel auto-detection: game found to have old headers for script blocks\n");
+	else
+		printf("Kernel auto-detection: game found to have newer headers for script blocks\n");
+
 	if (_oldGfxFunctions)
 		printf("Kernel auto-detection: game found to be using old graphics functions\n");
 	else
@@ -411,27 +417,56 @@
 		printf("Kernel auto-detection: found SCI0 game using a SCI1 kernel table\n");
 }
 
-void Kernel::loadSelectorNames(bool isOldSci0) {
-	int count;
+void Kernel::detectOldScriptHeader() {
+	if (_resmgr->_sciVersion != SCI_VERSION_0) {
+		_oldScriptHeader = false;
+		return;
+	}
 
 	Resource *r = _resmgr->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES), 0);
 
 	if (!r) // No such resource?
 		error("Kernel: Could not retrieve selector names");
 
-	count = READ_LE_UINT16(r->data) + 1; // Counter is slightly off
+	int count = READ_LE_UINT16(r->data) + 1; // Counter is slightly off
 
+	_oldScriptHeader = true;
+
 	for (int i = 0; i < count; i++) {
 		int offset = READ_LE_UINT16(r->data + 2 + i * 2);
 		int len = READ_LE_UINT16(r->data + offset);
 
 		Common::String tmp((const char *)r->data + offset + 2, len);
+
+		// We determine if the game has old script headers by the existence of the
+		// "setTarget" selector. The "motionInited" selector can also be used for the
+		// same purpose
+		if (tmp == "setTarget") {
+			_oldScriptHeader = false;
+			break;
+		}
+	}
+}
+
+void Kernel::loadSelectorNames() {
+	Resource *r = _resmgr->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES), 0);
+
+	if (!r) // No such resource?
+		error("Kernel: Could not retrieve selector names");
+
+	int count = READ_LE_UINT16(r->data) + 1; // Counter is slightly off
+
+	for (int i = 0; i < count; i++) {
+		int offset = READ_LE_UINT16(r->data + 2 + i * 2);
+		int len = READ_LE_UINT16(r->data + offset);
+
+		Common::String tmp((const char *)r->data + offset + 2, len);
 		_selectorNames.push_back(tmp);
 		//printf("%s\n", tmp.c_str());	// debug
 
 		// Early SCI versions used the LSB in the selector ID as a read/write
 		// toggle. To compensate for that, we add every selector name twice.
-		if (isOldSci0)
+		if (_oldScriptHeader)
 			_selectorNames.push_back(tmp);
 	}
 }

Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/kernel.h	2009-07-07 10:28:05 UTC (rev 42211)
@@ -57,7 +57,7 @@
 
 class Kernel {
 public:
-	Kernel(ResourceManager *resmgr, bool isOldSci0);
+	Kernel(ResourceManager *resmgr);
 	~Kernel();
 
 	uint getOpcodesSize() const { return _opcodes.size(); }
@@ -84,6 +84,16 @@
 	bool hasKernelFunction(const char *functionName) const;
 
 	/**
+	 * Applies to all versions before 0.000.395 (i.e. KQ4 old, XMAS 1988 and LSL2).
+	 * Old SCI versions used two word header for script blocks (first word equal
+	 * to 0x82, meaning of the second one unknown). New SCI versions used one
+	 * word header.
+	 * Also, old SCI versions assign 120 degrees to left & right, and 60 to up
+	 * and down. Later versions use an even 90 degree distribution.
+	 */
+	bool hasOldScriptHeader() const { return _oldScriptHeader; }
+
+	/**
 	 * Applies to all versions before 0.000.502
 	 * Old SCI versions used to interpret the third DrawPic() parameter inversely,
 	 * with the opposite default value (obviously).
@@ -127,17 +137,22 @@
 	/**
 	 * Loads the kernel selector names.
 	 */
-	void loadSelectorNames(bool isOldSci0);
+	void loadSelectorNames();
 
 	/**
+	 * Maps special selectors
+	 */
+	void mapSelectors();
+
+	/**
 	 * Prints auto-detected features from selectors
 	 */
 	void printAutoDetectedFeatures();
 
 	/**
-	 * Maps special selectors
+	 * Detects if the game is using older script headers
 	 */
-	void mapSelectors();
+	void detectOldScriptHeader();
 
 	/**
 	 * Maps kernel functions
@@ -151,6 +166,7 @@
 	bool loadOpcodes();
 
 	ResourceManager *_resmgr;
+	bool _oldScriptHeader;
 	bool _oldGfxFunctions;
 	bool _hasLofsAbsolute;
 

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -696,7 +696,7 @@
 
 	angle %= 360;
 
-	if (!(s->_flags & GF_SCI0_OLD)) {
+	if (!s->_kernel->hasOldScriptHeader()) {
 		if (angle < 45)
 			loop = 3;
 		else if (angle < 136)

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -497,7 +497,7 @@
 }
 
 static byte *find_unique_script_block(EngineState *s, byte *buf, int type) {
-	if (s->_flags & GF_SCI0_OLD)
+	if (s->_kernel->hasOldScriptHeader())
 		buf += 2;
 
 	do {

Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -243,7 +243,7 @@
 			int stackframe = (scr[pos.offset + 2] >> 1) + (*debugState.p_restadjust);
 			int argc = ((*debugState.p_sp)[- stackframe - 1]).offset;
 
-			if (!(s->_flags & GF_SCI0_OLD))
+			if (!s->_kernel->hasOldScriptHeader())
 				argc += (*debugState.p_restadjust);
 
 			printf(" Kernel params: (");

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -138,7 +138,7 @@
 	if (!script || (s->_version >= SCI_VERSION_1_1 && !heap)) {
 		error("SegManager::setScriptSize: failed to load %s", !script ? "script" : "heap");
 	}
-	if (s->_flags & GF_SCI0_OLD) {
+	if (s->_kernel->hasOldScriptHeader()) {
 		scr.buf_size = script->size + READ_LE_UINT16(script->data) * 2;
 		//locals_size = READ_LE_UINT16(script->data) * 2;
 	} else if (s->_version < SCI_VERSION_1_1) {

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -961,7 +961,7 @@
 			gc_countdown(s);
 
 			xs->sp -= (opparams[1] >> 1) + 1;
-			if (!(s->_flags & GF_SCI0_OLD)) {
+			if (!s->_kernel->hasOldScriptHeader()) {
 				xs->sp -= restadjust;
 				s->r_amp_rest = 0; // We just used up the restadjust, remember?
 			}
@@ -971,7 +971,7 @@
 			} else {
 				int argc = ASSERT_ARITHMETIC(xs->sp[0]);
 
-				if (!(s->_flags & GF_SCI0_OLD))
+				if (!s->_kernel->hasOldScriptHeader())
 					argc += restadjust;
 
 				if (s->_kernel->_kernelFuncs[opparams[0]].signature
@@ -988,7 +988,7 @@
 				xs_new = &(s->_executionStack.back());
 				s->_executionStackPosChanged = true;
 
-				if (!(s->_flags & GF_SCI0_OLD))
+				if (!s->_kernel->hasOldScriptHeader())
 					restadjust = s->r_amp_rest;
 
 			}
@@ -1500,7 +1500,7 @@
 
 	// Early SCI versions used the LSB in the selector ID as a read/write
 	// toggle, meaning that we must remove it for selector lookup.
-	if (s->_flags & GF_SCI0_OLD)
+	if (s->_kernel->hasOldScriptHeader())
 		selector_id &= ~1;
 
 	if (!obj) {
@@ -1659,7 +1659,7 @@
 
 	Script *scr = s->seg_manager->getScript(seg_id);
 
-	if (s->_flags & GF_SCI0_OLD) {
+	if (s->_kernel->hasOldScriptHeader()) {
 		//
 		int locals_nr = READ_LE_UINT16(script->data);
 
@@ -1835,7 +1835,7 @@
 }
 
 void script_uninstantiate_sci0(EngineState *s, int script_nr, SegmentId seg) {
-	reg_t reg = make_reg(seg, (s->_flags & GF_SCI0_OLD) ? 2 : 0);
+	reg_t reg = make_reg(seg, s->_kernel->hasOldScriptHeader() ? 2 : 0);
 	int objtype, objlength;
 	Script *scr = s->seg_manager->getScript(seg);
 
@@ -1879,7 +1879,7 @@
 }
 
 void script_uninstantiate(EngineState *s, int script_nr) {
-	reg_t reg = make_reg(0, (s->_flags & GF_SCI0_OLD) ? 2 : 0);
+	reg_t reg = make_reg(0, s->_kernel->hasOldScriptHeader() ? 2 : 0);
 
 	reg.segment = s->seg_manager->segGet(script_nr);
 	Script *scr = script_locate_by_segment(s, reg.segment);

Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/engine/vm.h	2009-07-07 10:28:05 UTC (rev 42211)
@@ -203,7 +203,7 @@
 	Selector printLang; /**< Used for i18n */
 	Selector subtitleLang;
 	Selector parseLang;
-	Selector motionCue;	   // Used to detect newer graphics functions semantics. 
+	Selector motionCue;	   // Used to detect newer graphics functions semantics
 	Selector sightAngle;   // Used to detect some SCI0/SCI01 games which need a SCI1 table
 	Selector setVol;	   // Used to detect newer sound semantics
 	Selector egoMoveSpeed; // Used to detect SCI1 games which use absolute values in lofs

Modified: scummvm/trunk/engines/sci/sci.cpp
===================================================================
--- scummvm/trunk/engines/sci/sci.cpp	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/sci.cpp	2009-07-07 10:28:05 UTC (rev 42211)
@@ -151,19 +151,13 @@
 	if (version < SCI_VERSION_1) {
 		// SCI0/SCI01
 	} else if (version == SCI_VERSION_1) {
-		// SCI1
-
-		if (flags & GF_SCI0_OLD ||
-			flags & GF_SCI0_OLDGETTIME) {
+		if (flags & GF_SCI0_OLDGETTIME) {
 			error("This game entry is erroneous. It's marked as SCI1, but it has SCI0 flags set");
 		}
 	} else if (version == SCI_VERSION_1_1 || version == SCI_VERSION_32) {
-		if (flags & GF_SCI0_OLD ||
-			flags & GF_SCI0_OLDGETTIME) {
+		if (flags & GF_SCI0_OLDGETTIME) {
 			error("This game entry is erroneous. It's marked as SCI1.1/SCI32, but it has SCI0 flags set");
 		}
-
-		// SCI1.1 / SCI32
 	} else {
 		error ("Unknown SCI version in game entry");
 	}

Modified: scummvm/trunk/engines/sci/sci.h
===================================================================
--- scummvm/trunk/engines/sci/sci.h	2009-07-07 09:38:08 UTC (rev 42210)
+++ scummvm/trunk/engines/sci/sci.h	2009-07-07 10:28:05 UTC (rev 42211)
@@ -83,19 +83,10 @@
 enum SciGameFlags {
 	// SCI0 flags
 
-	/* Applies to all versions before 0.000.395 (i.e. KQ4 old, XMAS 1988 and LSL2)
-	 * Old SCI versions used two word header for script blocks (first word equal
-	 * to 0x82, meaning of the second one unknown). New SCI versions used one
-	 * word header.
-	 * Also, old SCI versions assign 120 degrees to left & right, and 60 to up
-	 * and down. Later versions use an even 90 degree distribution.
-	 */
-	GF_SCI0_OLD				= (1 << 0),
-
 	/* Applies to all versions before 0.000.629
 	 * Older SCI versions had simpler code for GetTime()
 	 */
-	GF_SCI0_OLDGETTIME		= (1 << 1)
+	GF_SCI0_OLDGETTIME		= (1 << 0)
 };
 
 class SciEngine : public Engine {


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