Common::Error StarkEngine::loadGameState(int slot) { // Open the save file Common::String filename = formatSaveName(_targetName.c_str(), slot); Common::InSaveFile *save = _saveFileMan->openForLoading(filename); if (!save) { return _saveFileMan->getError(); } StateReadStream stream(save); // Read the header SaveMetadata metadata; Common::ErrorCode metadataErrorCode = metadata.read(&stream, filename); if (metadataErrorCode != Common::kNoError) { return metadataErrorCode; } // Reset the UI _userInterface->skipFMV(); _userInterface->clearLocationDependentState(); _userInterface->setInteractive(true); _userInterface->changeScreen(Screen::kScreenGame); _userInterface->restoreScreenHistory(); // Clear the previous world resources _resourceProvider->shutdown(); if (metadata.version >= 9) { metadata.skipGameScreenThumbnail(&stream); } // Read the resource trees state _stateProvider->readStateFromStream(&stream, metadata.version); // Read the diary state _diary->readStateFromStream(&stream, metadata.version); if (stream.eos()) { warning("Unexpected end of file reached when reading '%s'", filename.c_str()); return Common::kReadingFailed; } // Initialize the world resources with the loaded state _resourceProvider->initGlobal(); _resourceProvider->setShouldRestoreCurrentState(); _resourceProvider->requestLocationChange(metadata.levelIndex, metadata.locationIndex); if (metadata.version >= 9) { setTotalPlayTime(metadata.totalPlayTime); } return Common::kNoError; }
Common::Error DraciEngine::run() { init(); setTotalPlayTime(0); _game->init(); // Load game from specified slot, if any if (ConfMan.hasKey("save_slot")) { loadGameState(ConfMan.getInt("save_slot")); } _game->start(); return Common::kNoError; }
Common::Error AgiEngine::go() { CursorMan.showMouse(true); setTotalPlayTime(0); if (_game.state < STATE_LOADED) { do { mainCycle(); } while (_game.state < STATE_RUNNING); } runGame(); return Common::kNoError; }
void SciEngine::runGame() { setTotalPlayTime(0); initStackBaseWithSelector(SELECTOR(play)); // Call the play selector // Attach the debug console on game startup, if requested if (DebugMan.isDebugChannelEnabled(kDebugLevelOnStartup)) _console->attach(); _gamestate->_syncedAudioOptions = false; do { _gamestate->_executionStackPosChanged = false; run_vm(_gamestate); exitGame(); _gamestate->_syncedAudioOptions = true; if (_gamestate->abortScriptProcessing == kAbortRestartGame) { _gamestate->_segMan->resetSegMan(); initGame(); initStackBaseWithSelector(SELECTOR(play)); patchGameSaveRestore(); setLauncherLanguage(); _gamestate->gameIsRestarting = GAMEISRESTARTING_RESTART; _gamestate->_throttleLastTime = 0; if (_gfxMenu) _gfxMenu->reset(); _gamestate->abortScriptProcessing = kAbortNone; _gamestate->_syncedAudioOptions = false; } else if (_gamestate->abortScriptProcessing == kAbortLoadGame) { _gamestate->abortScriptProcessing = kAbortNone; _gamestate->_executionStack.clear(); initStackBaseWithSelector(SELECTOR(replay)); patchGameSaveRestore(); setLauncherLanguage(); _gamestate->shrinkStackToBase(); _gamestate->abortScriptProcessing = kAbortNone; syncSoundSettings(); syncIngameAudioOptions(); // Games do not set their audio settings when loading } else { break; // exit loop } } while (true); }
Common::Error SwordEngine::go() { _control->checkForOldSaveGames(); setTotalPlayTime(0); uint16 startPos = ConfMan.getInt("boot_param"); _control->readSavegameDescriptions(); if (startPos) { _logic->startPositions(startPos); } else { int saveSlot = ConfMan.getInt("save_slot"); // Savegames are numbered starting from 1 in the dialog window, // but their filenames are numbered starting from 0. if (saveSlot >= 0 && _control->savegamesExist() && _control->restoreGameFromFile(saveSlot)) { _control->doRestore(); } else if (_control->savegamesExist()) { _systemVars.controlPanelMode = CP_NEWGAME; if (_control->runPanel() == CONTROL_GAME_RESTORED) _control->doRestore(); else if (!shouldQuit()) _logic->startPositions(0); } else { // no savegames, start new game. _logic->startPositions(0); } } _systemVars.controlPanelMode = CP_NORMAL; while (!shouldQuit()) { uint8 action = mainLoop(); if (!shouldQuit()) { // the mainloop was left, we have to reinitialize. reinitialize(); if (action == CONTROL_GAME_RESTORED) _control->doRestore(); else if (action == CONTROL_RESTART_GAME) _logic->startPositions(1); _systemVars.forceRestart = false; _systemVars.controlPanelMode = CP_NORMAL; } } return Common::kNoError; }
Common::Error SagaEngine::run() { setTotalPlayTime(0); // Assign default values to the config manager, in case settings are missing ConfMan.registerDefault("talkspeed", "255"); ConfMan.registerDefault("subtitles", "true"); _musicVolume = ConfMan.getInt("music_volume"); _subtitlesEnabled = ConfMan.getBool("subtitles"); _readingSpeed = getTalkspeed(); _copyProtection = ConfMan.getBool("copy_protection"); _musicWasPlaying = false; _isIHNMDemo = Common::File::exists("music.res"); _hasITESceneSubstitutes = Common::File::exists("boarhall.bbm"); if (_readingSpeed > 3) _readingSpeed = 0; switch (getGameId()) { case GID_ITE: _resource = new Resource_RSC(this); break; #ifdef ENABLE_IHNM case GID_IHNM: _resource = new Resource_RES(this); break; #endif #ifdef ENABLE_SAGA2 case GID_DINO: case GID_FTA2: _resource = new Resource_HRS(this); break; #endif } // Detect game and open resource files if (!initGame()) { GUIErrorMessage("Error loading game resources."); return Common::kUnknownError; } // Initialize engine modules // TODO: implement differences for SAGA2 _sndRes = new SndRes(this); _events = new Events(this); if (!isSaga2()) { _font = new Font(this); _sprite = new Sprite(this); _script = new SAGA1Script(this); } else { _script = new SAGA2Script(this); } _anim = new Anim(this); _interface = new Interface(this); // requires script module _scene = new Scene(this); _actor = new Actor(this); _palanim = new PalAnim(this); if (getGameId() == GID_ITE) { _isoMap = new IsoMap(this); _puzzle = new Puzzle(this); } // System initialization _previousTicks = _system->getMillis(); // Initialize graphics _gfx = new Gfx(this, _system, getDisplayInfo().width, getDisplayInfo().height); // Graphics driver should be initialized before console _console = new Console(this); // Graphics should be initialized before music _music = new Music(this, _mixer); _render = new Render(this, _system); if (!_render->initialized()) { return Common::kUnknownError; } // Initialize system specific sound _sound = new Sound(this, _mixer); if (!isSaga2()) { _interface->converseClear(); _script->setVerb(_script->getVerbType(kVerbWalkTo)); } _music->setVolume(_musicVolume, 1); if (!isSaga2()) { _gfx->initPalette(); } if (_voiceFilesExist) { if (getGameId() == GID_IHNM) { if (!ConfMan.hasKey("voices")) { _voicesEnabled = true; ConfMan.setBool("voices", true); } else { _voicesEnabled = ConfMan.getBool("voices"); } } else { _voicesEnabled = true; } } syncSoundSettings(); int msec = 0; _previousTicks = _system->getMillis(); if (ConfMan.hasKey("start_scene")) { _scene->changeScene(ConfMan.getInt("start_scene"), 0, kTransitionNoFade); } else if (ConfMan.hasKey("boot_param")) { if (getGameId() == GID_ITE) _interface->addToInventory(_actor->objIndexToId(0)); // Magic hat _scene->changeScene(ConfMan.getInt("boot_param"), 0, kTransitionNoFade); } else if (ConfMan.hasKey("save_slot")) { // Init the current chapter to 8 (character selection) for IHNM if (getGameId() == GID_IHNM) _scene->changeScene(-2, 0, kTransitionFade, 8); // First scene sets up palette _scene->changeScene(getStartSceneNumber(), 0, kTransitionNoFade); _events->handleEvents(0); // Process immediate events if (getGameId() == GID_ITE) _interface->setMode(kPanelMain); else _interface->setMode(kPanelChapterSelection); char *fileName = calcSaveFileName(ConfMan.getInt("save_slot")); load(fileName); syncSoundSettings(); } else { _framesEsc = 0; _scene->startScene(); } uint32 currentTicks; while (!shouldQuit()) { _console->onFrame(); if (_render->getFlags() & RF_RENDERPAUSE) { // Freeze time while paused _previousTicks = _system->getMillis(); } else { currentTicks = _system->getMillis(); // Timer has rolled over after 49 days if (currentTicks < _previousTicks) msec = 0; else { msec = currentTicks - _previousTicks; _previousTicks = currentTicks; } if (msec > MAX_TIME_DELTA) { msec = MAX_TIME_DELTA; } // Since Puzzle and forced text are actorless, we do them here if ((getGameId() == GID_ITE && _puzzle->isActive()) || _actor->isForcedTextShown()) { _actor->handleSpeech(msec); } else if (!_scene->isInIntro()) { if (_interface->getMode() == kPanelMain || _interface->getMode() == kPanelConverse || _interface->getMode() == kPanelCutaway || _interface->getMode() == kPanelNull || _interface->getMode() == kPanelChapterSelection) _actor->direct(msec); } _events->handleEvents(msec); _script->executeThreads(msec); } // Per frame processing _render->drawScene(); _system->delayMillis(10); } return Common::kNoError; }
Common::Error ToltecsEngine::run() { initGraphics(640, 400, true); _isSaveAllowed = true; _counter01 = 0; _counter02 = 0; _movieSceneFlag = false; _flag01 = 0; _saveLoadRequested = 0; _cameraX = 0; _cameraY = 0; _newCameraX = 0; _newCameraY = 0; _cameraHeight = 0; _guiHeight = 26; _sceneWidth = 0; _sceneHeight = 0; _doSpeech = true; _doText = true; _walkSpeedY = 5; _walkSpeedX = 1; _mouseX = 0; _mouseY = 0; _mouseDblClickTicks = 60; _mouseWaitForRelease = false; _mouseButton = 0; _mouseDisabled = 0; _leftButtonDown = false; _rightButtonDown = false; _arc = new ArchiveReader(); _arc->openArchive("WESTERN"); _res = new ResourceCache(this); _screen = new Screen(this); _script = new ScriptInterpreter(this); _anim = new AnimationPlayer(this); _palette = new Palette(this); _segmap = new SegmentMap(this); _moviePlayer = new MoviePlayer(this); _music = new Music(_arc); _menuSystem = new MenuSystem(this); _sound = new Sound(this); _console = new Console(this); _cfgText = ConfMan.getBool("subtitles"); _cfgVoices = !ConfMan.getBool("speech_mute"); bool mute = false; if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, mute ? 0 : ConfMan.getInt("speech_volume")); _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, mute ? 0 : ConfMan.getInt("music_volume")); _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, mute ? 0 : ConfMan.getInt("sfx_volume")); syncSoundSettings(); CursorMan.showMouse(true); setupSysStrings(); #if 0 // Menu test _screen->registerFont(0, 0x0D); _screen->registerFont(1, 0x0E); _screen->loadMouseCursor(12); _palette->loadAddPalette(9, 224); _palette->setDeltaPalette(_palette->getMainPalette(), 7, 0, 31, 224); _screen->finishTalkTextItems(); _menuSystem->run(); /* while (1) { //updateInput(); _menuSystem->update(); updateScreen(); } */ return Common::kNoError; #endif // Start main game loop setTotalPlayTime(0); _script->loadScript(0, 0); _script->setMainScript(0); if (ConfMan.hasKey("save_slot")) { int saveSlot = ConfMan.getInt("save_slot"); if (saveSlot >= 0 && saveSlot <= 99) { _screen->loadMouseCursor(12); loadGameState(saveSlot); } } _script->runScript(); _music->stopSequence(); _sound->stopAll(); delete _console; delete _arc; delete _res; delete _screen; delete _script; delete _anim; delete _palette; delete _segmap; delete _music; delete _moviePlayer; delete _menuSystem; delete _sound; return Common::kNoError; }