bool GameDatabaseV3::getSavegameDescription(const char *filename, Common::String &description, int16 version) { Common::InSaveFile *in; char desc[64]; if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { return false; } uint32 header = in->readUint32BE(); if (header != MKTAG('S','G','A','M')) { warning("Save game header missing"); delete in; return false; } int32 size = in->readUint32LE(); if (size != in->size() - 64) { warning("Unexpected save game size. Expected %d, size is %d (file size - 64)", size, in->size() - 64); delete in; return false; } int16 saveVersion = in->readUint16LE(); if (saveVersion != version) { warning("Save game %s was saved with a different version of the game. Game version is %d, save version is %d", filename, version, saveVersion); delete in; return false; } in->read(desc, 64); description = desc; delete in; return true; }
bool LabEngine::loadGame(int slot) { Common::String fileName = generateSaveFileName(slot); Common::SaveFileManager *saveFileManager = _system->getSavefileManager(); Common::InSaveFile *file = saveFileManager->openForLoading(fileName); if (!file) return false; SaveGameHeader header; if (!readSaveGameHeader(file, header)) { delete file; return false; } _roomNum = file->readUint16LE(); _music->checkRoomMusic(1, _roomNum); _direction = file->readUint16LE(); setQuarters(file->readUint16LE()); // Conditions for (int i = 0; i < _conditions->_lastElement / (8 * 2); i++) _conditions->_array[i] = file->readUint16LE(); // Rooms found for (int i = 0; i < _roomsFound->_lastElement / (8 * 2); i++) _roomsFound->_array[i] = file->readUint16LE(); _specialLocks->load(file); // Breadcrumbs for (int i = 0; i < MAX_CRUMBS; i++) { _breadCrumbs[i]._crumbRoomNum = file->readUint16LE(); _breadCrumbs[i]._crumbDirection = file->readUint16LE(); } _droppingCrumbs = (_breadCrumbs[0]._crumbRoomNum != 0); _followingCrumbs = false; for (int i = 0; i < MAX_CRUMBS; i++) { if (_breadCrumbs[i]._crumbRoomNum == 0) break; _numCrumbs = i; } delete file; _curFileName = " "; _closeDataPtr = nullptr; _followingCrumbs = false; _graphics->_longWinInFront = false; _event->initMouse(); _mainDisplay = true; _alternate = false; _event->simulateEvent(); _graphics->screenUpdate(); return true; }
Common::Error ToucheEngine::loadGameState(int num) { bool loadOk = false; Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), num); Common::InSaveFile *f = _saveFileMan->openForLoading(gameStateFileName); if (f) { uint16 version = f->readUint16LE(); if (version < kCurrentGameStateVersion) { warning("Unsupported gamestate version %d (index %d)", version, num); } else { f->skip(2 + kGameStateDescriptionLen); loadGameStateData(f); if (f->err() || f->eos()) { warning("Can't read file '%s'", gameStateFileName.c_str()); } else { loadOk = true; } } delete f; } return loadOk ? Common::kNoError : Common::kUnknownError; }
int16 GameDatabaseV3::loadgame(const char *filename, int16 version) { Common::InSaveFile *in; uint32 expectedSize = 4 + 4 + 2 + _gameStateSize; if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { warning("Can't open file '%s', game not loaded", filename); return 1; } uint32 header = in->readUint32BE(); if (header != MKTAG('S','G','A','M')) { warning("Save game header missing"); delete in; return 1; } uint32 size = in->readUint32LE(); int16 saveVersion = in->readUint16LE(); if (saveVersion != version) { warning("Save game %s was saved with a different version of the game. Game version is %d, save version is %d", filename, version, saveVersion); delete in; return 1; } if (size != expectedSize) { warning("Unexpected save game size. Expected %d, size is %d", expectedSize, size); delete in; return 1; } in->skip(64); // skip savegame description in->read(_gameState, _gameStateSize); delete in; _objectPropertyCache.clear(); // make sure to clear cache return 0; }
void ToltecsEngine::loadgame(const char *filename) { Common::InSaveFile *in; if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { warning("Can't open file '%s', game not loaded", filename); return; } SaveHeader header; kReadSaveHeaderError errorCode = readSaveHeader(in, false, header); if (errorCode != kRSHENoError) { warning("Error loading savegame '%s'", filename); delete in; return; } _sound->stopAll(); _music->stopSequence(); g_engine->setTotalPlayTime(header.playTime * 1000); _cameraX = in->readUint16LE(); _cameraY = in->readUint16LE(); _cameraHeight = in->readUint16LE(); _guiHeight = in->readUint16LE(); _sceneWidth = in->readUint16LE(); _sceneHeight = in->readUint16LE(); _sceneResIndex = in->readUint32LE(); _walkSpeedX = in->readUint16LE(); _walkSpeedY = in->readUint16LE(); _counter01 = in->readUint32LE(); _counter02 = in->readUint32LE(); _movieSceneFlag = in->readByte() != 0; _flag01 = in->readByte(); _mouseX = in->readUint16LE(); _mouseY = in->readUint16LE(); _mouseDisabled = in->readUint16LE(); _system->warpMouse(_mouseX, _mouseY); _system->showMouse(_mouseDisabled == 0); _palette->loadState(in); _script->loadState(in); _anim->loadState(in); _screen->loadState(in); if (header.version >= 2) _sound->loadState(in); if (header.version >= 3) _music->loadState(in); delete in; loadScene(_sceneResIndex); _newCameraX = _cameraX; _newCameraY = _cameraY; }
void BbvsEngine::loadgame(const char *filename) { Common::InSaveFile *in; if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { warning("Can't open file '%s', game not loaded", filename); return; } SaveHeader header; kReadSaveHeaderError errorCode = readSaveHeader(in, false, header); if (errorCode != kRSHENoError) { warning("Error loading savegame '%s'", filename); delete in; return; } g_engine->setTotalPlayTime(header.playTime * 1000); memset(_sceneObjects, 0, sizeof(_sceneObjects)); for (int i = 0; i < kSceneObjectsCount; ++i) { _sceneObjects[i].walkDestPt.x = -1; _sceneObjects[i].walkDestPt.y = -1; } _currSceneNum = 0; _newSceneNum = in->readUint32LE(); initScene(false); _prevSceneNum = in->readUint32LE(); _gameState = in->readUint32LE(); _mouseCursorSpriteIndex = in->readUint32LE(); _mousePos.x = in->readUint16LE(); _mousePos.y = in->readUint16LE(); _currVerbNum = in->readUint32LE(); _activeItemType = in->readUint32LE(); _activeItemIndex = in->readUint32LE(); _verbPos.x = in->readUint16LE(); _verbPos.y = in->readUint16LE(); _inventoryButtonIndex = in->readUint32LE(); _currInventoryItem = in->readUint32LE(); _currTalkObjectIndex = in->readUint32LE(); _currCameraNum = in->readUint32LE(); _cameraPos.x = in->readUint16LE(); _cameraPos.y = in->readUint16LE(); _newCameraPos.x = in->readUint16LE(); _newCameraPos.y = in->readUint16LE(); _dialogSlotCount = in->readUint32LE(); _walkMousePos.x = in->readUint16LE(); _walkMousePos.y = in->readUint16LE(); in->read(_backgroundSoundsActive, kSceneSoundsCount); in->read(_inventoryItemStatus, kInventoryItemStatusCount); in->read(_dialogItemStatus, kDialogItemStatusCount); in->read(_gameVars, kGameVarsCount); in->read(_sceneVisited, kSceneVisitedCount); for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i) { SceneObject *obj = &_sceneObjects[i]; obj->x = in->readUint32LE(); obj->y = in->readUint32LE(); obj->animIndex = in->readUint32LE(); obj->frameIndex = in->readUint32LE(); obj->frameTicks = in->readUint32LE(); obj->walkCount = in->readUint32LE(); obj->xIncr = in->readUint32LE(); obj->yIncr = in->readUint32LE(); obj->turnValue = in->readUint32LE(); obj->turnCount = in->readUint32LE(); obj->turnTicks = in->readUint32LE(); obj->walkDestPt.x = in->readUint16LE(); obj->walkDestPt.y = in->readUint16LE(); obj->anim = obj->animIndex > 0 ? _gameModule->getAnimation(obj->animIndex) : 0; } updateWalkableRects(); // Restart scene background sounds for (int i = 0; i < _gameModule->getSceneSoundsCount(); ++i) { if (_backgroundSoundsActive[i]) { SceneSound *sceneSound = _gameModule->getSceneSound(i); playSound(sceneSound->soundNum, true); } } _currAction = 0; _currActionCommandIndex = -1; delete in; }