[Scummvm-cvs-logs] SF.net SVN: scummvm:[47501] scummvm/trunk/engines/kyra
athrxx at users.sourceforge.net
athrxx at users.sourceforge.net
Sun Jan 24 16:40:39 CET 2010
Revision: 47501
http://scummvm.svn.sourceforge.net/scummvm/?rev=47501&view=rev
Author: athrxx
Date: 2010-01-24 15:40:36 +0000 (Sun, 24 Jan 2010)
Log Message:
-----------
LOL: save/load menu speed up
Modified Paths:
--------------
scummvm/trunk/engines/kyra/gui_lol.cpp
scummvm/trunk/engines/kyra/gui_lol.h
Modified: scummvm/trunk/engines/kyra/gui_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_lol.cpp 2010-01-24 15:21:51 UTC (rev 47500)
+++ scummvm/trunk/engines/kyra/gui_lol.cpp 2010-01-24 15:40:36 UTC (rev 47501)
@@ -1921,6 +1921,8 @@
_mouseClick = 0;
_sliderSfx = 11;
_buttonListChanged = false;
+ _savegameList = 0;
+ _savegameListSize = 0;
}
void GUI_LoL::processButton(Button *button) {
@@ -2295,14 +2297,14 @@
// Instead, the respevtive struct entry is used to determine whether
// a menu has scroll buttons or slider bars.
uint8 hasSpecialButtons = 0;
+ _savegameListUpdateNeeded = true;
while (_displayMenu) {
_vm->_mouseX = _vm->_mouseY = 0;
if (_currentMenu == &_loadMenu || _currentMenu == &_saveMenu || _currentMenu == &_deleteMenu) {
- updateSaveList(true);
- Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Greater<int>());
- setupSavegameNames(*_currentMenu, 4);
+ updateSavegameList();
+ setupSaveMenuSlots(*_currentMenu, 4);
}
hasSpecialButtons = _currentMenu->highlightedItem;
@@ -2523,6 +2525,13 @@
_newMenu = 0;
}
+ if (_savegameList) {
+ for (int i = 0; i < _savegameListSize; i++)
+ delete[] _savegameList[i];
+ delete[] _savegameList;
+ _savegameList = 0;
+ }
+
return _menuResult;
}
@@ -2554,7 +2563,7 @@
_screen->updateScreen();
}
-void GUI_LoL::setupSavegameNames(Menu &menu, int num) {
+void GUI_LoL::setupSaveMenuSlots(Menu &menu, int num) {
char *s = (char *)_vm->_tempBuffer5120;
for (int i = 0; i < num; ++i) {
@@ -2571,20 +2580,14 @@
slotOffs = 1;
}
- KyraEngine_v1::SaveHeader header;
- Common::InSaveFile *in;
- for (int i = startSlot; i < num && uint(_savegameOffset + i - slotOffs) < _saveSlots.size(); ++i) {
- if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset - slotOffs]), header)) != 0) {
- strncpy(s, header.description.c_str(), 80);
+ for (int i = startSlot; i < num && uint(_savegameOffset + i - slotOffs) < _savegameListSize; ++i) {
+ if (_savegameList[_saveSlots[i + _savegameOffset - slotOffs]]) {
+ strncpy(s, _savegameList[_saveSlots[i + _savegameOffset - slotOffs]], 80);
s[79] = 0;
-
- Util::convertISOToDOS(s);
-
menu.item[i].itemString = s;
s += (strlen(s) + 1);
menu.item[i].saveSlot = _saveSlots[i + _savegameOffset - slotOffs];
menu.item[i].enabled = true;
- delete in;
}
}
@@ -2598,6 +2601,47 @@
}
}
+void GUI_LoL::updateSavegameList() {
+ if (!_savegameListUpdateNeeded)
+ return;
+
+ _savegameListUpdateNeeded = false;
+
+ if (_savegameList) {
+ for (int i = 0; i < _savegameListSize; i++)
+ delete[] _savegameList[i];
+ delete[] _savegameList;
+ }
+
+ updateSaveList(true);
+ _savegameListSize = _saveSlots.size();
+
+ if (_savegameListSize) {
+ Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Greater<int>());
+
+ KyraEngine_v1::SaveHeader header;
+ Common::InSaveFile *in;
+
+ _savegameList = new char*[_savegameListSize];
+
+ for (int i = 0; i < _savegameListSize; i++) {
+ in = _vm->openSaveForReading(_vm->getSavegameFilename(i), header);
+ if (in) {
+ _savegameList[i] = new char[header.description.size() + 1];
+ strncpy(_savegameList[i], header.description.c_str(), header.description.size() + 1);
+ Util::convertISOToDOS(_savegameList[i]);
+ delete in;
+ } else {
+ _savegameList[i] = 0;
+ error("GUI_LoL::updateSavegameList(): Unexpected missing save file for slot: %d.", i);
+ }
+ }
+
+ } else {
+ _savegameList = 0;
+ }
+}
+
void GUI_LoL::printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 flags) {
_screen->fprintString("%s", x, y, c0, c1, _vm->gameFlags().use16ColorMode ? (flags & 3) : flags , str);
}
@@ -2900,6 +2944,7 @@
_vm->_saveFileMan->renameSavefile(oldName, newName);
}
_newMenu = &_mainMenu;
+ _savegameListUpdateNeeded = true;
}
} else if (button->arg == _choiceMenu.item[1].itemId) {
_newMenu = &_mainMenu;
Modified: scummvm/trunk/engines/kyra/gui_lol.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_lol.h 2010-01-24 15:21:51 UTC (rev 47500)
+++ scummvm/trunk/engines/kyra/gui_lol.h 2010-01-24 15:40:36 UTC (rev 47501)
@@ -114,7 +114,8 @@
void backupPage0();
void restorePage0();
- void setupSavegameNames(Menu &menu, int num);
+ void setupSaveMenuSlots(Menu &menu, int num);
+ void updateSavegameList();
void printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 flags);
int getMenuCenterStringX(const char *str, int x1, int x2);
@@ -173,6 +174,10 @@
Button::Callback _scrollUpFunctor;
Button::Callback _scrollDownFunctor;
+
+ char **_savegameList;
+ int _savegameListSize;
+ bool _savegameListUpdateNeeded;
};
} // End of namespace Kyra
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