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

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Wed Nov 10 02:08:17 CET 2010


Revision: 54178
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54178&view=rev
Author:   thebluegr
Date:     2010-11-10 01:08:17 +0000 (Wed, 10 Nov 2010)

Log Message:
-----------
SCI: Some SCI3 changes
- Extended the SCI2.1 kernel function signatures for SCI3, as they share 
the same kernel table
- All the engine parts are now initialized in SCI3 games, apart from the VM

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel_tables.h
    scummvm/trunk/engines/sci/sci.cpp

Modified: scummvm/trunk/engines/sci/engine/kernel_tables.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel_tables.h	2010-11-10 00:36:43 UTC (rev 54177)
+++ scummvm/trunk/engines/sci/engine/kernel_tables.h	2010-11-10 01:08:17 UTC (rev 54178)
@@ -59,7 +59,7 @@
 #define SIG_SCI1           SCI_VERSION_1_EGA, SCI_VERSION_1_LATE
 #define SIG_SCI11          SCI_VERSION_1_1, SCI_VERSION_1_1
 #define SIG_SINCE_SCI11    SCI_VERSION_1_1, SCI_VERSION_NONE
-#define SIG_SCI21          SCI_VERSION_2_1, SCI_VERSION_2_1
+#define SIG_SCI21          SCI_VERSION_2_1, SCI_VERSION_3
 
 #define SIG_SCI16          SCI_VERSION_NONE, SCI_VERSION_1_1
 #define SIG_SCI32          SCI_VERSION_2, SCI_VERSION_NONE
@@ -68,7 +68,7 @@
 #define SIG_SOUNDSCI0      SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE
 #define SIG_SOUNDSCI1EARLY SCI_VERSION_1_EARLY, SCI_VERSION_1_EARLY
 #define SIG_SOUNDSCI1LATE  SCI_VERSION_1_LATE, SCI_VERSION_1_LATE
-#define SIG_SOUNDSCI21     SCI_VERSION_2_1, SCI_VERSION_2_1
+#define SIG_SOUNDSCI21     SCI_VERSION_2_1, SCI_VERSION_3
 
 #define SIGFOR_ALL   0x3f
 #define SIGFOR_DOS   1 << 0

Modified: scummvm/trunk/engines/sci/sci.cpp
===================================================================
--- scummvm/trunk/engines/sci/sci.cpp	2010-11-10 00:36:43 UTC (rev 54177)
+++ scummvm/trunk/engines/sci/sci.cpp	2010-11-10 01:08:17 UTC (rev 54178)
@@ -224,37 +224,30 @@
 	_audio = new AudioPlayer(_resMan);
 	_gamestate = new EngineState(segMan);
 	_eventMan = new EventManager(_resMan->detectFontExtended());
-	
-	// TODO/FIXME: Remove once SCI3 support is improved
+
 	if (getSciVersion() == SCI_VERSION_3) {
-		initGraphics();	// invoked to init the graphics subsystem
+		// TODO: SCI3 equivalent
+		warning("SCI3 game - skipping VM initialization");
 		_gamestate->_msgState = NULL;	// for proper engine destruction
-		// Attach the console to use resource manager functionality
-		_console->attach();
-		_console->DebugPrintf("\nSCI3 game, stopping before actual game initialization.\n"
-							  "Resource-related functionality should be usable at this point\n\n");
-		_console->onFrame();
+	} else {
+		// The game needs to be initialized before the graphics system is initialized, as
+		// the graphics code checks parts of the seg manager upon initialization (e.g. for
+		// the presence of the fastCast object)
+		if (!initGame()) { /* Initialize */
+			warning("Game initialization failed: Aborting...");
+			// TODO: Add an "init failed" error?
+			return Common::kUnknownError;
+		}
 
-		return Common::kNoError;
+		// we try to find the super class address of the game object, we can't do that earlier
+		const Object *gameObject = segMan->getObject(_gameObjectAddress);
+		if (!gameObject) {
+			warning("Could not get game object, aborting...");
+			return Common::kUnknownError;
+		}
+		_gameSuperClassAddress = gameObject->getSuperClassSelector();
 	}
 
-	// The game needs to be initialized before the graphics system is initialized, as
-	// the graphics code checks parts of the seg manager upon initialization (e.g. for
-	// the presence of the fastCast object)
-	if (!initGame()) { /* Initialize */
-		warning("Game initialization failed: Aborting...");
-		// TODO: Add an "init failed" error?
-		return Common::kUnknownError;
-	}
-
-	// we try to find the super class address of the game object, we can't do that earlier
-	const Object *gameObject = segMan->getObject(_gameObjectAddress);
-	if (!gameObject) {
-		warning("Could not get game object, aborting...");
-		return Common::kUnknownError;
-	}
-	_gameSuperClassAddress = gameObject->getSuperClassSelector();
-
 	script_adjust_opcode_formats();
 
 	// Must be called after game_init(), as they use _features
@@ -268,38 +261,40 @@
 
 	debug("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion()));
 
-	// Patch in our save/restore code, so that dialogs are replaced
-	patchGameSaveRestore(segMan);
+	if (getSciVersion() <= SCI_VERSION_2_1) {		// TODO/FIXME: Enable for SCI3 once the VM is done
+		// Patch in our save/restore code, so that dialogs are replaced
+		patchGameSaveRestore(segMan);
 
-	if (_gameDescription->flags & ADGF_ADDENGLISH) {
-		// if game is multilingual
-		Common::Language selectedLanguage = Common::parseLanguage(ConfMan.get("language"));
-		if (selectedLanguage == Common::EN_ANY) {
-			// and english was selected as language
-			if (SELECTOR(printLang) != -1) // set text language to english
-				writeSelectorValue(segMan, _gameObjectAddress, SELECTOR(printLang), 1);
-			if (SELECTOR(parseLang) != -1) // and set parser language to english as well
-				writeSelectorValue(segMan, _gameObjectAddress, SELECTOR(parseLang), 1);
+		if (_gameDescription->flags & ADGF_ADDENGLISH) {
+			// if game is multilingual
+			Common::Language selectedLanguage = Common::parseLanguage(ConfMan.get("language"));
+			if (selectedLanguage == Common::EN_ANY) {
+				// and english was selected as language
+				if (SELECTOR(printLang) != -1) // set text language to english
+					writeSelectorValue(segMan, _gameObjectAddress, SELECTOR(printLang), 1);
+				if (SELECTOR(parseLang) != -1) // and set parser language to english as well
+					writeSelectorValue(segMan, _gameObjectAddress, SELECTOR(parseLang), 1);
+			}
 		}
-	}
 
-	// Check whether loading a savestate was requested
-	int directSaveSlotLoading = ConfMan.getInt("save_slot");
-	if (directSaveSlotLoading >= 0) {
-		// call GameObject::play (like normally)
-		initStackBaseWithSelector(SELECTOR(play));
-		// We set this, so that the game automatically quit right after init
-		_gamestate->variables[VAR_GLOBAL][4] = TRUE_REG;
+		// Check whether loading a savestate was requested
+		int directSaveSlotLoading = ConfMan.getInt("save_slot");
+		if (directSaveSlotLoading >= 0) {
+			// call GameObject::play (like normally)
+			initStackBaseWithSelector(SELECTOR(play));
+			// We set this, so that the game automatically quit right after init
+			_gamestate->variables[VAR_GLOBAL][4] = TRUE_REG;
 
-		_gamestate->_executionStackPosChanged = false;
-		run_vm(_gamestate);
+			_gamestate->_executionStackPosChanged = false;
+			run_vm(_gamestate);
 
-		// As soon as we get control again, actually restore the game
-		reg_t restoreArgv[2] = { NULL_REG, make_reg(0, directSaveSlotLoading) };	// special call (argv[0] is NULL)
-		kRestoreGame(_gamestate, 2, restoreArgv);
+			// As soon as we get control again, actually restore the game
+			reg_t restoreArgv[2] = { NULL_REG, make_reg(0, directSaveSlotLoading) };	// special call (argv[0] is NULL)
+			kRestoreGame(_gamestate, 2, restoreArgv);
 
-		// this indirectly calls GameObject::init, which will setup menu, text font/color codes etc.
-		//  without this games would be pretty badly broken
+			// this indirectly calls GameObject::init, which will setup menu, text font/color codes etc.
+			//  without this games would be pretty badly broken
+		}
 	}
 
 	// Show any special warnings for buggy scripts with severe game bugs, 
@@ -362,7 +357,17 @@
 		                  "having unexpected errors and/or issues later on.");
 	}
 
-	runGame();
+	
+	// TODO/FIXME: Remove once SCI3 support is improved
+	if (getSciVersion() == SCI_VERSION_3) {
+		// Attach the console to use resource manager functionality
+		_console->attach();
+		_console->DebugPrintf("\nSCI3 game, stopping before actual game entry point.\n"
+							  "Resource-related functionality should be usable at this point\n\n");
+		_console->onFrame();
+	} else {
+		runGame();
+	}
 
 	ConfMan.flushToDisk();
 


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