aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorFilippos Karapetis2010-11-17 14:08:13 +0000
committerFilippos Karapetis2010-11-17 14:08:13 +0000
commitc003032b4cb25e1ea9e3f9cdee904604c30fb4ff (patch)
treecfab3d0c66e67b215cf408da7192809c40c94b3c /engines/sci
parentbb9b7c24f9e301d35c1dcfb1a498df4af2a154db (diff)
downloadscummvm-rg350-c003032b4cb25e1ea9e3f9cdee904604c30fb4ff.tar.gz
scummvm-rg350-c003032b4cb25e1ea9e3f9cdee904604c30fb4ff.tar.bz2
scummvm-rg350-c003032b4cb25e1ea9e3f9cdee904604c30fb4ff.zip
SCI: Allow SCI3 game scripts to run
SCI3 scripts do start up now, however they stop quite early, as there is still missing functionality which prevents them from running fully. This will be useful for debugging, though svn-id: r54292
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/sci.cpp102
1 files changed, 42 insertions, 60 deletions
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index a073e0626a..3ffb33f934 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -226,28 +226,22 @@ Common::Error SciEngine::run() {
_gamestate = new EngineState(segMan);
_eventMan = new EventManager(_resMan->detectFontExtended());
- if (getSciVersion() == SCI_VERSION_3) {
- // TODO: SCI3 equivalent
- warning("SCI3 game - skipping VM initialization");
- _gamestate->_msgState = NULL; // for proper engine destruction
- } 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;
- }
+ // 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();
+ // 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();
@@ -262,40 +256,38 @@ Common::Error SciEngine::run() {
debug("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion()));
- 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);
- }
+ // 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);
}
+ }
- // 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,
@@ -358,17 +350,7 @@ Common::Error SciEngine::run() {
"having unexpected errors and/or issues later on.");
}
-
- // 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();
- }
+ runGame();
ConfMan.flushToDisk();