[Scummvm-cvs-logs] SF.net SVN: scummvm: [31392] scummvm/trunk/engines/kyra

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sat Apr 5 03:49:28 CEST 2008


Revision: 31392
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31392&view=rev
Author:   lordhoto
Date:     2008-04-04 18:49:28 -0700 (Fri, 04 Apr 2008)

Log Message:
-----------
Implemented proper savefile listing, this fixes bug #1479872 "KYRA1: a small menu issue".

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/gui.cpp
    scummvm/trunk/engines/kyra/gui.h
    scummvm/trunk/engines/kyra/gui_v1.cpp
    scummvm/trunk/engines/kyra/gui_v2.cpp

Modified: scummvm/trunk/engines/kyra/gui.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui.cpp	2008-04-04 21:00:58 UTC (rev 31391)
+++ scummvm/trunk/engines/kyra/gui.cpp	2008-04-05 01:49:28 UTC (rev 31392)
@@ -298,6 +298,21 @@
 	return 0;
 }
 
+void GUI::updateSaveList() {
+	Common::String pattern = _vm->_targetName + ".???";
+	Common::StringList saveFileList = _vm->_saveFileMan->listSavefiles(pattern.c_str());
+	Common::sort(saveFileList.begin(), saveFileList.end());
+	_saveSlots.clear();
+
+	for (Common::StringList::const_iterator i = saveFileList.begin(); i != saveFileList.end(); ++i) {
+		char s1 = 0, s2 = 0, s3 = 0;
+		s1 = (*i)[i->size()-3] - '0';
+		s2 = (*i)[i->size()-2] - '0';
+		s3 = (*i)[i->size()-1] - '0';
+		_saveSlots.push_back(s1*100+s2*10+s3);
+	}
+}
+
 int GUI::getNextSavegameSlot() {
 	Common::InSaveFile *in;
 

Modified: scummvm/trunk/engines/kyra/gui.h
===================================================================
--- scummvm/trunk/engines/kyra/gui.h	2008-04-04 21:00:58 UTC (rev 31391)
+++ scummvm/trunk/engines/kyra/gui.h	2008-04-05 01:49:28 UTC (rev 31392)
@@ -30,6 +30,7 @@
 #include "kyra/kyra.h"
 
 #include "common/ptr.h"
+#include "common/array.h"
 
 namespace Kyra {
 
@@ -185,6 +186,8 @@
 	void redrawText(const Menu &menu);
 	void redrawHighlight(const Menu &menu);
 
+	Common::Array<int> _saveSlots;
+	void updateSaveList();
 	int getNextSavegameSlot();
 };
 

Modified: scummvm/trunk/engines/kyra/gui_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v1.cpp	2008-04-04 21:00:58 UTC (rev 31391)
+++ scummvm/trunk/engines/kyra/gui_v1.cpp	2008-04-05 01:49:28 UTC (rev 31392)
@@ -613,12 +613,12 @@
 	}
 
 	KyraEngine::SaveHeader header;
-	for (int i = startSlot; i < num; i++) {
-		if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(i + _savegameOffset), header))) {
+	for (int i = startSlot; i < num && uint(_savegameOffset + i) < _saveSlots.size(); i++) {
+		if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset]), header))) {
 			strncpy(savenames[i], header.description.c_str(), 31);
 			menu.item[i].itemString = savenames[i];
 			menu.item[i].enabled = 1;
-			menu.item[i].saveSlot = i + _savegameOffset;
+			menu.item[i].saveSlot = _saveSlots[i + _savegameOffset];
 			delete in;
 		} else {
 			menu.item[i].enabled = 0;
@@ -630,6 +630,8 @@
 
 int GUI_v1::saveGameMenu(Button *button) {
 	debugC(9, kDebugLevelGUI, "GUI_v1::saveGameMenu()");
+	updateSaveList();
+
 	updateMenuButton(button);
 	_menu[2].item[5].enabled = true;
 
@@ -671,6 +673,8 @@
 
 int GUI_v1::loadGameMenu(Button *button) {
 	debugC(9, kDebugLevelGUI, "GUI_v1::loadGameMenu()");
+	updateSaveList();
+
 	if (_vm->_menuDirectlyToLoad) {
 		_menu[2].item[5].enabled = false;
 	} else {
@@ -1101,6 +1105,8 @@
 	updateMenuButton(button);
 
 	_savegameOffset++;
+	if (uint(_savegameOffset + 5) >= _saveSlots.size())
+		_savegameOffset = MAX<int>(_saveSlots.size() - 5, 0);
 	setupSavegames(_menu[2], 5);
 	initMenu(_menu[2]);
 

Modified: scummvm/trunk/engines/kyra/gui_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v2.cpp	2008-04-04 21:00:58 UTC (rev 31391)
+++ scummvm/trunk/engines/kyra/gui_v2.cpp	2008-04-05 01:49:28 UTC (rev 31392)
@@ -1396,10 +1396,10 @@
 
 	KyraEngine::SaveHeader header;
 	Common::InSaveFile *in;
-	for (int i = startSlot; i < num; ++i) {
-		if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(i + _savegameOffset), header)) != 0) {
+	for (int i = startSlot; i < num && uint(_savegameOffset + i) < _saveSlots.size(); ++i) {
+		if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset]), header)) != 0) {
 			strncpy(_vm->getTableString(menu.item[i].itemId, _vm->_optionsBuffer, 0), header.description.c_str(), 80);
-			menu.item[i].saveSlot = i + _savegameOffset;
+			menu.item[i].saveSlot = _saveSlots[i + _savegameOffset];
 			menu.item[i].enabled = true;
 			delete in;
 		}
@@ -1421,10 +1421,9 @@
 }
 
 int GUI_v2::scrollUpButton(Button *button) {
-	int startSlot = _isSaveMenu ? 1 : 0;
 	updateMenuButton(button);
 
-	if (_savegameOffset <= startSlot)
+	if (_savegameOffset == 0)
 		return 0;
 
 	--_savegameOffset;
@@ -1444,6 +1443,10 @@
 int GUI_v2::scrollDownButton(Button *button) {
 	updateMenuButton(button);
 	++_savegameOffset;
+
+	if (uint(_savegameOffset + 5) >= _saveSlots.size())
+		_savegameOffset = MAX<int>(_saveSlots.size() - 5, 0);
+
 	if (_isLoadMenu) {
 		setupSavegameNames(_loadMenu, 5);
 		// original calls something different here...
@@ -1737,6 +1740,8 @@
 }
 
 int GUI_v2::loadMenu(Button *caller) {
+	updateSaveList();
+
 	if (!_vm->_menuDirectlyToLoad) {
 		updateMenuButton(caller);
 		restorePage1(_vm->_screenBuffer);
@@ -1803,7 +1808,8 @@
 }
 
 int GUI_v2::saveMenu(Button *caller) {
-	//XXX
+	updateSaveList();
+
 	updateMenuButton(caller);
 
 	restorePage1(_vm->_screenBuffer);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list