aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/console.cpp1
-rw-r--r--engines/sci/console.h1
-rw-r--r--engines/sci/engine/kfile.cpp30
3 files changed, 32 insertions, 0 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index 27d8a489cb..259687461c 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -109,6 +109,7 @@ Console::Console(SciEngine *vm) : GUI::Debugger() {
DCmd_Register("version", WRAP_METHOD(Console, cmdGetVersion));
DCmd_Register("room", WRAP_METHOD(Console, cmdRoomNumber));
DCmd_Register("exit", WRAP_METHOD(Console, cmdExit));
+ DCmd_Register("listsaves", WRAP_METHOD(Console, cmdListSaves));
// Screen
DCmd_Register("sci0_palette", WRAP_METHOD(Console, cmdSci0Palette));
DCmd_Register("clear_screen", WRAP_METHOD(Console, cmdClearScreen));
diff --git a/engines/sci/console.h b/engines/sci/console.h
index 6aa1027fa2..b6bc7523d6 100644
--- a/engines/sci/console.h
+++ b/engines/sci/console.h
@@ -79,6 +79,7 @@ private:
bool cmdGetVersion(int argc, const char **argv);
bool cmdRoomNumber(int argc, const char **argv);
bool cmdExit(int argc, const char **argv);
+ bool cmdListSaves(int argc, const char **argv);
// Screen
bool cmdSci0Palette(int argc, const char **argv);
bool cmdClearScreen(int argc, const char **argv);
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index cfee0ed47d..5610a5c751 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -32,6 +32,7 @@
#include "sci/engine/state.h"
#include "sci/engine/kernel.h"
#include "sci/engine/savegame.h"
+#include "sci/console.h"
namespace Sci {
@@ -278,6 +279,35 @@ void listSavegames(Common::Array<SavegameDesc> &saves) {
qsort(saves.begin(), saves.size(), sizeof(SavegameDesc), _savegame_index_struct_compare);
}
+bool Console::cmdListSaves(int argc, const char **argv) {
+ Common::Array<SavegameDesc> saves;
+ listSavegames(saves);
+
+ Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
+
+ for (uint i = 0; i < saves.size(); i++) {
+ Common::String filename = ((Sci::SciEngine*)g_engine)->getSavegameName(saves[i].id);
+ Common::SeekableReadStream *in;
+ if ((in = saveFileMan->openForLoading(filename))) {
+ SavegameMetadata meta;
+ if (!get_savegame_metadata(in, &meta)) {
+ // invalid
+ delete in;
+ continue;
+ }
+
+ if (!meta.savegame_name.empty()) {
+ if (meta.savegame_name.lastChar() == '\n')
+ meta.savegame_name.deleteLastChar();
+
+ DebugPrintf("%s: '%s'\n", filename.c_str(), meta.savegame_name.c_str());
+ }
+ delete in;
+ }
+ }
+ return true;
+}
+
reg_t kFGets(EngineState *s, int argc, reg_t *argv) {
int maxsize = argv[1].toUint16();
char *buf = new char[maxsize];