virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const { Common::String filename = generateGameStateFileName(target, slot); Common::ScopedPtr<Common::InSaveFile> in(g_system->getSavefileManager()->openForLoading(filename)); if (!in) return SaveStateDescriptor(); char buf[25]; in->seek(0); in->read(buf, 24); buf[24] = 0; Common::String desc = buf; in->seek(TeenAgent::saveStateSize); if (!Graphics::checkThumbnailHeader(*in)) return SaveStateDescriptor(slot, desc); SaveStateDescriptor ssd(slot, desc); //checking for the thumbnail if (Graphics::Surface *const thumb = Graphics::loadThumbnail(*in)) ssd.setThumbnail(thumb); return ssd; }
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const { Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading( generateGameStateFileName(target, slot)); assert(f); tSage::tSageSavegameHeader header; tSage::Saver::readSavegameHeader(f, header); delete f; // Create the return descriptor SaveStateDescriptor desc(slot, header.saveName); desc.setDeletableFlag(true); desc.setWriteProtectedFlag(false); desc.setThumbnail(header.thumbnail); desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); desc.setSaveTime(header.saveHour, header.saveMinutes); desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME); return desc; }
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; }
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const { Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading( generateGameStateFileName(target, slot)); if (f) { TsAGE::tSageSavegameHeader header; TsAGE::Saver::readSavegameHeader(f, header); delete f; // Create the return descriptor SaveStateDescriptor desc(slot, header._saveName); desc.setThumbnail(header._thumbnail); desc.setSaveDate(header._saveYear, header._saveMonth, header._saveDay); desc.setSaveTime(header._saveHour, header._saveMinutes); desc.setPlayTime(header._totalFrames * GAME_FRAME_TIME); return desc; } return SaveStateDescriptor(); }
Common::Error ToucheEngine::saveGameState(int num, const Common::String &description) { bool saveOk = false; Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), num); Common::OutSaveFile *f = _saveFileMan->openForSaving(gameStateFileName); if (f) { f->writeUint16LE(kCurrentGameStateVersion); f->writeUint16LE(0); char headerDescription[kGameStateDescriptionLen]; memset(headerDescription, 0, kGameStateDescriptionLen); strncpy(headerDescription, description.c_str(), kGameStateDescriptionLen - 1); f->write(headerDescription, kGameStateDescriptionLen); saveGameStateData(f); f->finalize(); if (!f->err()) { saveOk = true; } else { warning("Can't write file '%s'", gameStateFileName.c_str()); } delete f; } return saveOk ? Common::kNoError : Common::kUnknownError; }
virtual void removeSaveState(const char *target, int slot) const { Common::String filename = generateGameStateFileName(target, slot); g_system->getSavefileManager()->removeSavefile(filename); }
void ToucheEngine::handleOptions(int forceDisplay) { if (_disabledInputCounter == 0 || forceDisplay != 0) { setDefaultCursor(_currentKeyCharNum); _gameState = kGameStateOptionsDialog; MenuData menuData; memset(&menuData, 0, sizeof(MenuData)); menuData.quit = false; menuData.exit = false; menuData.mode = kMenuSettingsMode; int curMode = -1; bool doRedraw = false; while (!menuData.quit) { if (menuData.mode != curMode) { doRedraw = true; setupMenu(menuData.mode, &menuData); curMode = menuData.mode; if (menuData.mode == kMenuLoadStateMode || menuData.mode == kMenuSaveStateMode) { for (int i = 0; i < kMaxSaveStates; ++i) { menuData.saveLoadDescriptionsTable[i][0] = 0; } Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), 0, true); Common::StringArray filenames = _saveFileMan->listSavefiles(gameStateFileName); for (Common::StringArray::const_iterator it = filenames.begin(); it != filenames.end(); ++it) { int i = getGameStateFileSlot(it->c_str()); if (i >= 0 && i < kMaxSaveStates) { Common::InSaveFile *f = _saveFileMan->openForLoading(*it); if (f) { readGameStateDescription(f, menuData.saveLoadDescriptionsTable[i], 32); delete f; } } } } } if (doRedraw) { redrawMenu(&menuData); updateScreenArea(90, 102, 460, 196); doRedraw = false; } Common::Event event; while (_eventMan->pollEvent(event)) { const Button *button = 0; switch (event.type) { case Common::EVENT_RTL: case Common::EVENT_QUIT: menuData.quit = true; menuData.exit = true; break; case Common::EVENT_LBUTTONDOWN: button = menuData.findButtonUnderCursor(event.mouse.x, event.mouse.y); if (button) { handleMenuAction(&menuData, button->action); doRedraw = true; } break; case Common::EVENT_KEYDOWN: if (menuData.mode == kMenuSaveStateMode) { if (event.kbd.keycode == Common::KEYCODE_BACKSPACE) { menuData.removeLastCharFromDescription(_saveLoadCurrentSlot); } else { menuData.addCharToDescription(_saveLoadCurrentSlot, (char)event.kbd.ascii); } doRedraw = true; } break; case Common::EVENT_WHEELUP: handleMenuAction(&menuData, kActionScrollUpSaves); doRedraw = true; break; case Common::EVENT_WHEELDOWN: handleMenuAction(&menuData, kActionScrollDownSaves); doRedraw = true; break; default: break; } } _system->updateScreen(); _system->delayMillis(10); } _fullRedrawCounter = 2; if (!menuData.exit && shouldQuit()) { if (displayQuitDialog()) quitGame(); } _gameState = kGameStateGameLoop; } }