[Scummvm-git-logs] scummvm master -> ca9d48f1687d10929edcda9cfcbbead94b981903

dreammaster paulfgilbert at gmail.com
Sat Feb 15 05:40:42 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
11992f04c1 ULTIMA8: Make u8 save gump strings translatable
ca9d48f168 ULTIMA8: Simplifying savegame code


Commit: 11992f04c1708979bcf418ffaff126e2e0f71e61
    https://github.com/scummvm/scummvm/commit/11992f04c1708979bcf418ffaff126e2e0f71e61
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-14T21:40:33-08:00

Commit Message:
ULTIMA8: Make u8 save gump strings translatable

Changed paths:
    engines/ultima/POTFILES
    engines/ultima/ultima8/gumps/u8_save_gump.cpp


diff --git a/engines/ultima/POTFILES b/engines/ultima/POTFILES
index dd89637..7136d43 100644
--- a/engines/ultima/POTFILES
+++ b/engines/ultima/POTFILES
@@ -2,3 +2,4 @@ engines/ultima/shared/engine/ultima.cpp
 engines/ultima/shared/engine/data_archive.cpp
 engines/ultima/nuvie/save/save_game.cpp
 engines/ultima/ultima8/ultima8.cpp
+engines/ultima/ultima8/gumps/u8_save_gump.cpp
diff --git a/engines/ultima/ultima8/gumps/u8_save_gump.cpp b/engines/ultima/ultima8/gumps/u8_save_gump.cpp
index 00cd2c2..6a1e96a 100644
--- a/engines/ultima/ultima8/gumps/u8_save_gump.cpp
+++ b/engines/ultima/ultima8/gumps/u8_save_gump.cpp
@@ -22,7 +22,6 @@
 
 #include "ultima/ultima8/misc/pent_include.h"
 #include "ultima/ultima8/gumps/u8_save_gump.h"
-
 #include "ultima/ultima8/graphics/render_surface.h"
 #include "ultima/ultima8/gumps/desktop_gump.h"
 #include "ultima/ultima8/gumps/widgets/edit_widget.h"
@@ -36,9 +35,9 @@
 #include "ultima/ultima8/gumps/paged_gump.h"
 #include "ultima/ultima8/world/get_object.h"
 #include "ultima/ultima8/world/actors/main_actor.h"
-
 #include "ultima/ultima8/filesys/idata_source.h"
 #include "ultima/ultima8/filesys/odata_source.h"
+#include "common/translation.h"
 
 namespace Ultima {
 namespace Ultima8 {
@@ -314,13 +313,13 @@ void U8SaveGump::loadDescriptions() {
 		// FIXME: move version checks elsewhere!!
 		switch (state) {
 		case SavegameReader::SAVE_CORRUPT:
-			descriptions[i] = "[corrupt] ";
+			descriptions[i] = _("[corrupt]");
 			break;
 		case SavegameReader::SAVE_OUT_OF_DATE:
-			descriptions[i] = "[outdated] ";
+			descriptions[i] = _("[outdated]");
 			break;
 		case SavegameReader::SAVE_TOO_RECENT:
-			descriptions[i] = "[too modern] ";
+			descriptions[i] = _("[too modern]");
 			break;
 		default:
 			break;


Commit: ca9d48f1687d10929edcda9cfcbbead94b981903
    https://github.com/scummvm/scummvm/commit/ca9d48f1687d10929edcda9cfcbbead94b981903
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-14T21:40:33-08:00

Commit Message:
ULTIMA8: Simplifying savegame code

Changed paths:
    engines/ultima/ultima8/conf/setting_manager.cpp
    engines/ultima/ultima8/filesys/savegame.cpp
    engines/ultima/ultima8/filesys/savegame.h
    engines/ultima/ultima8/games/game.h
    engines/ultima/ultima8/games/remorse_game.cpp
    engines/ultima/ultima8/games/remorse_game.h
    engines/ultima/ultima8/games/start_u8_process.cpp
    engines/ultima/ultima8/games/start_u8_process.h
    engines/ultima/ultima8/games/u8_game.cpp
    engines/ultima/ultima8/games/u8_game.h
    engines/ultima/ultima8/gumps/pentagram_menu_gump.cpp
    engines/ultima/ultima8/gumps/u8_save_gump.cpp
    engines/ultima/ultima8/gumps/u8_save_gump.h
    engines/ultima/ultima8/ultima8.cpp
    engines/ultima/ultima8/ultima8.h


diff --git a/engines/ultima/ultima8/conf/setting_manager.cpp b/engines/ultima/ultima8/conf/setting_manager.cpp
index f3e1975..162fb00 100644
--- a/engines/ultima/ultima8/conf/setting_manager.cpp
+++ b/engines/ultima/ultima8/conf/setting_manager.cpp
@@ -43,7 +43,7 @@ SettingManager::SettingManager() {
 
 void SettingManager::setupScummVMSettings() {
 	conffileman->readConfigString("", "ScummVM", false);
-
+ 
 	int saveSlot = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1;
 	if (saveSlot != -1)
 		set("lastSave", Std::string::format("@save/%d", saveSlot), DOM_SCUMMVM);
diff --git a/engines/ultima/ultima8/filesys/savegame.cpp b/engines/ultima/ultima8/filesys/savegame.cpp
index bc7f2f5..2b96d60 100644
--- a/engines/ultima/ultima8/filesys/savegame.cpp
+++ b/engines/ultima/ultima8/filesys/savegame.cpp
@@ -35,41 +35,37 @@ namespace Ultima8 {
 #define SAVEGAME_IDENT MKTAG('V', 'M', 'U', '8')
 #define SAVEGAME_VERSION 5
 
-SavegameReader::SavegameReader(IDataSource *ds, bool metadataOnly) : _file(ds), _version(0) {
-	if (!MetaEngine::readSavegameHeader(ds->GetRawStream(), &_header, false))
+SavegameReader::SavegameReader(Common::SeekableReadStream *rs, bool metadataOnly) : _file(rs), _version(0) {
+	if (!MetaEngine::readSavegameHeader(rs, &_header))
 		return;
 
-	// Set total play time
-	g_engine->setTotalPlayTime(_header.playtime * 1000);
-
 	// Validate the identifier for a valid savegame
-	uint32 ident = ds->read4();
+	uint32 ident = _file->readUint32LE();
 	if (ident != SAVEGAME_IDENT)
 		return;
 
-	_version = ds->read4();
+	_version = _file->readUint32LE();
 	if (metadataOnly)
 		return;
 
 	// Load the index
-	uint count = ds->read2();
+	uint count = _file->readUint16LE();
 
 	for (uint idx = 0; idx < count; ++idx) {
 		char name[12];
-		ds->read(name, 12);
+		_file->read(name, 12);
 		name[11] = '\0';
 
 		FileEntry fe;
-		fe._size = ds->read4();
-		fe._offset = ds->getPos();
+		fe._size = _file->readUint32LE();
+		fe._offset = _file->pos();
 
 		_index[Common::String(name)] = fe;
-		ds->skip(fe._size);
+		_file->skip(fe._size);
 	}
 }
 
 SavegameReader::~SavegameReader() {
-	delete _file;
 }
 
 SavegameReader::State SavegameReader::isValid() const {
@@ -95,7 +91,7 @@ IDataSource *SavegameReader::getDataSource(const Std::string &name) {
 }
 
 
-SavegameWriter::SavegameWriter(ODataSource *ds) : _file(ds) {
+SavegameWriter::SavegameWriter(Common::WriteStream *ws) : _file(ws) {
 	assert(_file);
 }
 
@@ -104,11 +100,11 @@ SavegameWriter::~SavegameWriter() {
 
 bool SavegameWriter::finish() {
 	 // Write ident and savegame version
-	_file->write4(SAVEGAME_IDENT);
-	_file->write4(SAVEGAME_VERSION);
+	_file->writeUint32LE(SAVEGAME_IDENT);
+	_file->writeUint32LE(SAVEGAME_VERSION);
 
 	// Iterate through writing out the files
-	_file->write2(_index.size());
+	_file->writeUint16LE(_index.size());
 	for (uint idx = 0; idx < _index.size(); ++idx) {
 		// Set up a 12 byte space containing the resource name
 		FileEntry &fe = _index[idx];
@@ -118,15 +114,10 @@ bool SavegameWriter::finish() {
 
 		// Write out name, size, and data
 		_file->write(name, 12);
-		_file->write4(fe.size());
+		_file->writeUint32LE(fe.size());
 		_file->write(&fe[0], fe.size());
 	}
 	
-	// Handle adding savegame header
-	Common::OutSaveFile *dest = dynamic_cast<Common::OutSaveFile *>(_file->GetRawStream());
-	MetaEngine::appendExtendedSave(dest, Shared::g_ultima->getTotalPlayTime() / 1000, _description);
-	dest->finalize();
-
 	return true;
 }
 
diff --git a/engines/ultima/ultima8/filesys/savegame.h b/engines/ultima/ultima8/filesys/savegame.h
index 80d0f31..4fd09a3 100644
--- a/engines/ultima/ultima8/filesys/savegame.h
+++ b/engines/ultima/ultima8/filesys/savegame.h
@@ -25,7 +25,7 @@
 
 #include "ultima/shared/std/string.h"
 #include "common/hashmap.h"
-#include "common/serializer.h"
+#include "common/stream.h"
 #include "engines/metaengine.h"
 #include "graphics/surface.h"
 
@@ -46,10 +46,10 @@ class SavegameReader {
 private:
 	ExtendedSavegameHeader _header;
 	Common::HashMap<Common::String, FileEntry> _index;
-	IDataSource *_file;
+	Common::SeekableReadStream *_file;
 	uint32 _version;
 public:
-	explicit SavegameReader(IDataSource *ds, bool metadataOnly = false);
+	explicit SavegameReader(Common::SeekableReadStream *rs, bool metadataOnly = false);
 	~SavegameReader();
 
 	enum State { SAVE_CORRUPT, SAVE_VALID, SAVE_OUT_OF_DATE, SAVE_TOO_RECENT };
@@ -72,19 +72,12 @@ class SavegameWriter {
 		FileEntry() : Common::Array<byte>() {}
 	};
 private:
-	ODataSource *_file;
+	Common::WriteStream *_file;
 	Common::Array<FileEntry> _index;
-	Std::string _description;
 public:
-	explicit SavegameWriter(ODataSource *ds);
+	explicit SavegameWriter(Common::WriteStream *ws);
 	virtual ~SavegameWriter();
 
-	//! write the savegame's description.
-	bool writeDescription(const Std::string &desc) {
-		_description = desc;
-		return true;
-	}
-
 	//! write a file to the savegame
 	//! \param name name of the file
 	//! \param data the data
diff --git a/engines/ultima/ultima8/games/game.h b/engines/ultima/ultima8/games/game.h
index 43e667d..77ac96d 100644
--- a/engines/ultima/ultima8/games/game.h
+++ b/engines/ultima/ultima8/games/game.h
@@ -47,7 +47,7 @@ public:
 	virtual bool startGame() = 0;
 
 	//! start initial usecode
-	virtual bool startInitialUsecode(const Std::string &savegame) = 0;
+	virtual bool startInitialUsecode(int saveSlot = -1) = 0;
 
 	//! write game-specific savegame info (avatar stats, equipment, ...)
 	virtual void writeSaveInfo(ODataSource *ods) = 0;
diff --git a/engines/ultima/ultima8/games/remorse_game.cpp b/engines/ultima/ultima8/games/remorse_game.cpp
index 1c9e2f8..9c13e98 100644
--- a/engines/ultima/ultima8/games/remorse_game.cpp
+++ b/engines/ultima/ultima8/games/remorse_game.cpp
@@ -95,7 +95,7 @@ bool RemorseGame::startGame() {
 	return true;
 }
 
-bool RemorseGame::startInitialUsecode(const Std::string &) {
+bool RemorseGame::startInitialUsecode(int saveSlot) {
 //	Process* proc = new StartU8Process();
 //	Kernel::get_instance()->addProcess(proc);
 
diff --git a/engines/ultima/ultima8/games/remorse_game.h b/engines/ultima/ultima8/games/remorse_game.h
index 2d491b6..e1f67e9 100644
--- a/engines/ultima/ultima8/games/remorse_game.h
+++ b/engines/ultima/ultima8/games/remorse_game.h
@@ -36,7 +36,7 @@ public:
 	bool startGame() override;
 
 	//! start initial usecode
-	bool startInitialUsecode(const Std::string &savegame) override;
+	bool startInitialUsecode(int saveSlot = -1) override;
 
 	//! write game-specific savegame info (avatar stats, equipment, ...)
 	void writeSaveInfo(ODataSource *ods) override;
diff --git a/engines/ultima/ultima8/games/start_u8_process.cpp b/engines/ultima/ultima8/games/start_u8_process.cpp
index 67f9dc8..393f690 100644
--- a/engines/ultima/ultima8/games/start_u8_process.cpp
+++ b/engines/ultima/ultima8/games/start_u8_process.cpp
@@ -41,8 +41,8 @@ namespace Ultima8 {
 // p_dynamic_cast stuff
 DEFINE_RUNTIME_CLASSTYPE_CODE(StartU8Process, Process)
 
-StartU8Process::StartU8Process(const Std::string &saveName) : Process(),
-		_init(false), _saveName(saveName), _skipStart(!saveName.empty()) {
+StartU8Process::StartU8Process(int saveSlot) : Process(),
+		_init(false), _saveSlot(saveSlot), _skipStart(saveSlot >= 0) {
 }
 
 
@@ -58,7 +58,7 @@ void StartU8Process::run() {
 	}
 
 	// Try to load the save game, if succeeded this pointer will no longer be valid
-	if (!_saveName.empty() && Ultima8Engine::get_instance()->loadGame(_saveName)) {
+	if (_saveSlot >= 0 &&Ultima8Engine::get_instance()->loadGameState(_saveSlot).getCode() == Common::kNoError) {
 		return;
 	}
 
diff --git a/engines/ultima/ultima8/games/start_u8_process.h b/engines/ultima/ultima8/games/start_u8_process.h
index 335a7b6..c17137c 100644
--- a/engines/ultima/ultima8/games/start_u8_process.h
+++ b/engines/ultima/ultima8/games/start_u8_process.h
@@ -31,11 +31,11 @@ class StartU8Process : public Process {
 protected:
 	bool _init;
 	bool _skipStart;
-	Std::string _saveName;
+	int _saveSlot;
 
 	void saveData(ODataSource *ods) override;
 public:
-	StartU8Process(const Std::string &saveName);
+	StartU8Process(int saveSlot = -1);
 
 	// p_dynamic_cast stuff
 	ENABLE_RUNTIME_CLASSTYPE()
diff --git a/engines/ultima/ultima8/games/u8_game.cpp b/engines/ultima/ultima8/games/u8_game.cpp
index e0d861d..ec1ddf7 100644
--- a/engines/ultima/ultima8/games/u8_game.cpp
+++ b/engines/ultima/ultima8/games/u8_game.cpp
@@ -341,8 +341,8 @@ void U8Game::ConCmd_cheatEquip(const Console::ArgvType &argv) {
 	av->setEquip(item, false);
 }
 
-bool U8Game::startInitialUsecode(const Std::string &savegame) {
-	Process *proc = new StartU8Process(savegame);
+bool U8Game::startInitialUsecode(int saveSlot) {
+	Process *proc = new StartU8Process(saveSlot);
 	Kernel::get_instance()->addProcess(proc);
 
 	return true;
diff --git a/engines/ultima/ultima8/games/u8_game.h b/engines/ultima/ultima8/games/u8_game.h
index d8886e7..b87b5c0 100644
--- a/engines/ultima/ultima8/games/u8_game.h
+++ b/engines/ultima/ultima8/games/u8_game.h
@@ -38,7 +38,7 @@ public:
 	bool startGame() override;
 
 	//! start initial usecode
-	bool startInitialUsecode(const Std::string &savegame) override;
+	bool startInitialUsecode(int saveSlot) override;
 
 	//! write game-specific savegame info (avatar stats, equipment, ...)
 	void writeSaveInfo(ODataSource *ods) override;
diff --git a/engines/ultima/ultima8/gumps/pentagram_menu_gump.cpp b/engines/ultima/ultima8/gumps/pentagram_menu_gump.cpp
index aeceb13..624b1dd 100644
--- a/engines/ultima/ultima8/gumps/pentagram_menu_gump.cpp
+++ b/engines/ultima/ultima8/gumps/pentagram_menu_gump.cpp
@@ -230,7 +230,7 @@ bool PentagramMenuGump::OnKeyDown(int key, int mod) {
 void PentagramMenuGump::ProcessCallback(Std::string gamename, int message) {
 	if (message != 0) {
 		SettingManager *settingman = SettingManager::get_instance();
-		settingman->set("lastSave", message != 1 ? U8SaveGump::getFilename(message) : Std::string());
+		settingman->set("lastSave", message != 1 ? message : -1);
 		Ultima8Engine::get_instance()->changeGame(gamename);
 	}
 
diff --git a/engines/ultima/ultima8/gumps/u8_save_gump.cpp b/engines/ultima/ultima8/gumps/u8_save_gump.cpp
index 6a1e96a..708755d 100644
--- a/engines/ultima/ultima8/gumps/u8_save_gump.cpp
+++ b/engines/ultima/ultima8/gumps/u8_save_gump.cpp
@@ -37,6 +37,7 @@
 #include "ultima/ultima8/world/actors/main_actor.h"
 #include "ultima/ultima8/filesys/idata_source.h"
 #include "ultima/ultima8/filesys/odata_source.h"
+#include "common/savefile.h"
 #include "common/translation.h"
 
 namespace Ultima {
@@ -268,22 +269,13 @@ bool U8SaveGump::OnKeyDown(int key, int mod) {
 	return false;
 }
 
-Std::string U8SaveGump::getFilename(int index) {
-	return Std::string::format("@save/%d", index);
-}
-
 bool U8SaveGump::loadgame(int saveIndex) {
 	if (saveIndex == 1) {
-		Ultima8Engine::get_instance()->newGame(Std::string());
+		Ultima8Engine::get_instance()->newGame();
 		return true;
+	} else {
+		return Ultima8Engine::get_instance()->loadGameState(saveIndex).getCode() == Common::kNoError;
 	}
-
-	pout << "Load " << saveIndex << Std::endl;
-
-	Std::string filename = getFilename(saveIndex);
-	Ultima8Engine::get_instance()->loadGame(filename);
-
-	return true;
 }
 
 bool U8SaveGump::savegame(int saveIndex, const Std::string &name) {
@@ -291,22 +283,22 @@ bool U8SaveGump::savegame(int saveIndex, const Std::string &name) {
 
 	if (name.empty()) return false;
 
-	Std::string filename = getFilename(saveIndex);
-	Ultima8Engine::get_instance()->saveGame(filename, name, true);
+	Ultima8Engine::get_instance()->saveGame(saveIndex, name, true);
 	return true;
 }
 
 void U8SaveGump::loadDescriptions() {
-	descriptions.resize(6);
+	descriptions.resize( 6);
 
 	for (int i = 0; i < 6; ++i) {
 		int saveIndex = 6 * page + i + 1;
 
-		Std::string filename = getFilename(saveIndex);
-		IDataSource *ids = FileSystem::get_instance()->ReadFile(filename);
-		if (!ids) continue;
+		Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
+			Ultima8Engine::get_instance()->getSaveStateName(saveIndex));
+		if (!saveFile)
+			continue;
 
-		SavegameReader *sg = new SavegameReader(ids, true);
+		SavegameReader *sg = new SavegameReader(saveFile, true);
 		SavegameReader::State state = sg->isValid();
 		descriptions[i] = "";
 
@@ -325,6 +317,8 @@ void U8SaveGump::loadDescriptions() {
 			break;
 		}
 
+		if (state != SavegameReader::SAVE_VALID)
+			descriptions[i] += " ";
 		descriptions[i] += sg->getDescription();
 		delete sg;
 	}
diff --git a/engines/ultima/ultima8/gumps/u8_save_gump.h b/engines/ultima/ultima8/gumps/u8_save_gump.h
index 11641b9..091db55 100644
--- a/engines/ultima/ultima8/gumps/u8_save_gump.h
+++ b/engines/ultima/ultima8/gumps/u8_save_gump.h
@@ -49,8 +49,6 @@ public:
 	void ChildNotify(Gump *child, uint32 message) override;
 	void OnFocus(bool gain) override;
 
-	static Std::string getFilename(int index);
-
 	static Gump *showLoadSaveGump(Gump *parent, bool save);
 
 protected:
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index ac3a5df..0eaee68 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -553,11 +553,8 @@ void Ultima8Engine::startupGame() {
 	if (getGameInfo()->type == GameInfo::GAME_U8)
 		_audioMixer->openMidiOutput();
 
-	Std::string savegame;
-	settingman->setDefault("lastSave", "");
-	settingman->get("lastSave", savegame);
-
-	newGame(savegame);
+	int saveSlot = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1;
+	newGame(saveSlot);
 
 	_consoleGump->HideConsole();
 
@@ -1314,13 +1311,7 @@ bool Ultima8Engine::canSaveGameStateCurrently(bool isAutosave) {
 	return true;
 }
 
-Common::Error Ultima8Engine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	return saveGame(Std::string::format("@save/%d", slot), desc) ?
-		Common::kNoError : Common::kWritingFailed;
-}
-
-bool Ultima8Engine::saveGame(Std::string filename, Std::string desc,
-	bool ignore_modals) {
+bool Ultima8Engine::saveGame(int slot, const Std::string &desc, bool ignore_modals) {
 	// Don't allow saving with Modals open
 	if (!ignore_modals && _desktopGump->FindGump<ModalGump>()) {
 		pout << "Can't save: modal gump open." << Std::endl;
@@ -1335,23 +1326,20 @@ bool Ultima8Engine::saveGame(Std::string filename, Std::string desc,
 		return false;
 	}
 
-	pout << "Saving..." << Std::endl;
+	settingman->set("lastSave", slot);
 
-	pout << "Savegame file: " << filename << Std::endl;
-	pout << "Description: " << desc << Std::endl;
+	return saveGameState(slot, desc).getCode() == Common::kNoError;
+}
 
+Common::Error Ultima8Engine::saveGameStream(Common::WriteStream *stream, bool isAutosave) {
 	// Hack - don't save mouse over status for gumps
 	Gump *gump = _mouse->getMouseOverGump();
 	if (gump)
 		gump->OnMouseLeft();
 
-	ODataSource *ods = filesystem->WriteFile(filename);
-	if (!ods) return false;
-
 	_saveCount++;
 
-	SavegameWriter *sgw = new SavegameWriter(ods);
-	sgw->writeDescription(desc);
+	SavegameWriter *sgw = new SavegameWriter(stream);
 
 	// We'll make it 2KB initially
 	OAutoBufferDataSource buf(2048);
@@ -1407,11 +1395,9 @@ bool Ultima8Engine::saveGame(Std::string filename, Std::string desc,
 	// Restore mouse over
 	if (gump) gump->OnMouseOver();
 
-	settingman->set("lastSave", filename);
-
 	pout << "Done" << Std::endl;
 
-	return true;
+	return Common::kNoError;
 }
 
 void Ultima8Engine::resetEngine() {
@@ -1498,7 +1484,7 @@ void Ultima8Engine::setupCoreGumps() {
 		_objectManager->reserveObjId(i);
 }
 
-bool Ultima8Engine::newGame(const Std::string &savegame) {
+bool Ultima8Engine::newGame(int saveSlot) {
 	con->Print(MM_INFO, "Starting New Game...\n");
 
 	resetEngine();
@@ -1529,9 +1515,9 @@ bool Ultima8Engine::newGame(const Std::string &savegame) {
 	//	av->teleport(54, 14783,5959,8); // shrine of the Ancient Ones; Hanoi
 	//	av->teleport(5, 5104,22464,48); // East road (tenebrae end)
 
-	_game->startInitialUsecode(savegame);
+	_game->startInitialUsecode(saveSlot);
 
-	settingman->set("lastSave", savegame);
+	settingman->set("lastSave", saveSlot);
 
 	return true;
 }
@@ -1546,35 +1532,21 @@ void Ultima8Engine::syncSoundSettings() {
 		midiPlayer->setVolume(_mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType));
 }
 
-Common::Error Ultima8Engine::loadGameState(int slot) {
-	return loadGame(Std::string::format("@save/%d", slot)) ?
-		Common::kNoError : Common::kReadingFailed;
-}
-
-bool Ultima8Engine::loadGame(Std::string filename) {
-	con->Print(MM_INFO, "Loading...\n");
-
-	IDataSource *ids = filesystem->ReadFile(filename);
-	if (!ids) {
-		Error("Can't load file", "Error Loading savegame " + filename);
-		settingman->set("lastSave", "");
-		return false;
-	}
-
-	SavegameReader *sg = new SavegameReader(ids);
+Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream) {
+	SavegameReader *sg = new SavegameReader(stream);
 	SavegameReader::State state = sg->isValid();
 	if (state == SavegameReader::SAVE_CORRUPT) {
-		Error("Invalid or corrupt savegame", "Error Loading savegame " + filename);
+		Error("Invalid or corrupt savegame", "Error Loading savegame");
 		delete sg;
 		settingman->set("lastSave", "");
-		return false;
+		return Common::kReadingFailed;
 	}
 
 	if (state != SavegameReader::SAVE_VALID) {
-		Error("Unsupported savegame version", "Error Loading savegame " + filename);
+		Error("Unsupported savegame version", "Error Loading savegame");
 		delete sg;
 		settingman->set("lastSave", "");
-		return false;
+		return Common::kReadingFailed;
 	}
 
 	IDataSource *ds;
@@ -1584,9 +1556,9 @@ bool Ultima8Engine::loadGame(Std::string filename) {
 	bool ok = saveinfo.load(ds, version);
 
 	if (!ok) {
-		Error("Invalid or corrupt savegame: missing GameInfo", "Error Loading savegame " + filename);
+		Error("Invalid or corrupt savegame: missing GameInfo", "Error Loading savegame");
 		delete sg;
-		return false;
+		return Common::kReadingFailed;
 	}
 
 	if (!gameinfo->match(saveinfo)) {
@@ -1607,8 +1579,8 @@ bool Ultima8Engine::loadGame(Std::string filename) {
 		perr << message << Std::endl;
 #else
 		settingman->set("lastSave", "");
-		Error(message, "Error Loading savegame " + filename);
-		return false;
+		Error(message, "Error Loading savegame");
+		return Common::kReadingFailed;
 #endif
 	}
 
@@ -1690,17 +1662,17 @@ bool Ultima8Engine::loadGame(Std::string filename) {
 	delete ds;
 
 	if (!totalok) {
-		Error(message, "Error Loading savegame " + filename, true);
+		Error(message, "Error Loading savegame", true);
 		delete sg;
-		return false;
+		return Common::kReadingFailed;
 	}
 
 	pout << "Done" << Std::endl;
 
-	settingman->set("lastSave", filename);
+	settingman->set("lastSave", -1);
 
 	delete sg;
-	return true;
+	return Common::kNoError;
 }
 
 void Ultima8Engine::Error(Std::string message, Std::string title, bool exit_to_menu) {
@@ -1811,7 +1783,7 @@ bool Ultima8Engine::load(IDataSource *ids, uint32 version) {
 void Ultima8Engine::ConCmd_saveGame(const Console::ArgvType &argv) {
 	if (argv.size() == 2) {
 		// Save a _game with the given name into the quicksave slot
-		Ultima8Engine::get_instance()->saveGame("@save/1", argv[1]);
+		Ultima8Engine::get_instance()->saveGame(1, argv[1]);
 	} else {
 		Ultima8Engine::get_instance()->saveGameDialog();
 	}
@@ -1821,14 +1793,14 @@ void Ultima8Engine::ConCmd_loadGame(const Console::ArgvType &argv) {
 	if (argv.size() == 2) {
 		// Load a _game from the quicksave slot. The second parameter is ignored,
 		// it just needs to be present to differentiate from showing the GUI load dialog
-		Ultima8Engine::get_instance()->loadGame("@save/1");
+		Ultima8Engine::get_instance()->loadGameState(1);
 	} else {
 		Ultima8Engine::get_instance()->loadGameDialog();
 	}
 }
 
 void Ultima8Engine::ConCmd_newGame(const Console::ArgvType &argv) {
-	Ultima8Engine::get_instance()->newGame(Std::string());
+	Ultima8Engine::get_instance()->newGame();
 }
 
 void Ultima8Engine::ConCmd_quit(const Console::ArgvType &argv) {
diff --git a/engines/ultima/ultima8/ultima8.h b/engines/ultima/ultima8/ultima8.h
index 040c262..f669485 100644
--- a/engines/ultima/ultima8/ultima8.h
+++ b/engines/ultima/ultima8/ultima8.h
@@ -325,31 +325,21 @@ public:
 	/**
 	 * Load a game state
 	 */
-	Common::Error loadGameState(int slot) override;
+	Common::Error loadGameStream(Common::SeekableReadStream *stream) override;
 
 	/**
-	 * Save a game state.
-	 * @param slot	the slot into which the savestate should be stored
-	 * @param desc	a description for the savestate, entered by the user
-	 * @param isAutosave If true, autosave is being created
-	 * @return returns kNoError on success, else an error code.
+	 * Handles saving savegame state to a stream
 	 */
-	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave) override;
+	Common::Error saveGameStream(Common::WriteStream *stream, bool isAutosave) override;
 
 	//! save a game
 	//! \param filename the file to save to
 	//! \return true if succesful
-	bool saveGame(Std::string filename, Std::string desc,
-	              bool ignore_modals = false);
-
-	//! load a game
-	//! \param filename the savegame to load
-	//! \return true if succesful.
-	bool loadGame(Std::string filename);
+	bool saveGame(int slot, const Std::string &desc, bool ignore_modals = false);
 
 	//! start a new game
 	//! \return true if succesful.
-	bool newGame(const Std::string &savegame);
+	bool newGame(int saveSlot = -1);
 
 	//! Enter gump text mode (aka SDL Unicode keyhandling)
 	void enterTextMode(Gump *);




More information about the Scummvm-git-logs mailing list