mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-13 21:31:53 +00:00
multiple files save-load implementation
svn-id: r18303
This commit is contained in:
parent
55f98f9b04
commit
d1ffc9df2d
@ -86,10 +86,8 @@ int SagaEngine::processInput() {
|
||||
_render->toggleFlag(RF_ACTOR_PATH_TEST);
|
||||
break;
|
||||
case 288: // F7
|
||||
save();
|
||||
break;
|
||||
case 289: // F8
|
||||
load();
|
||||
break;
|
||||
case 9: // Tab
|
||||
_script->SThreadDebugStep();
|
||||
|
@ -303,10 +303,8 @@ void Interface::setMode(int mode, bool force) {
|
||||
break;
|
||||
case(kPanelSave):
|
||||
_savePanel.currentButton = NULL;
|
||||
_textInputMaxWidth = _saveEdit->width - 9;
|
||||
_textInputMaxWidth = _saveEdit->width - 10;
|
||||
_textInput = true;
|
||||
_textInputString[0] = 0;
|
||||
strcpy(_textInputString, "test1");
|
||||
_textInputStringLength = strlen(_textInputString);
|
||||
_textInputPos = _textInputStringLength + 1;
|
||||
_textInputRepeatPhase = 0;
|
||||
@ -585,7 +583,7 @@ void Interface::draw() {
|
||||
}
|
||||
|
||||
void Interface::calcOptionSaveSlider() {
|
||||
int totalFiles = _vm->getSaveFileNameCount();
|
||||
int totalFiles = _vm->getSaveFilesCount();
|
||||
int visibleFiles = _vm->getDisplayInfo().optionSaveFileVisible;
|
||||
int height = _optionSaveFileSlider->height;
|
||||
int sliderHeight;
|
||||
@ -686,11 +684,11 @@ void Interface::drawOption() {
|
||||
if (idx == _optionSaveFileTitleNumber) {
|
||||
SWAP(bgColor, fgColor);
|
||||
}
|
||||
if (idx < _vm->getSaveFileNameCount()) {
|
||||
if (idx < _vm->getSaveFilesCount()) {
|
||||
rect2.top = rect.top + j * (fontHeight + 1);
|
||||
rect2.bottom = rect2.top + fontHeight;
|
||||
backBuffer->fillRect(rect2, bgColor);
|
||||
text = _vm->getSaveFileName(idx);
|
||||
text = _vm->getSaveFile(idx)->name;
|
||||
_vm->_font->draw(SMALL_FONT_ID, backBuffer, text, 0,
|
||||
rect.left + 1, rect2.top, fgColor, 0, 0);
|
||||
}
|
||||
@ -811,7 +809,7 @@ void Interface::handleLoadClick(const Point& mousePoint) {
|
||||
void Interface::setLoad(PanelButton *panelButton) {
|
||||
_loadPanel.currentButton = NULL;
|
||||
switch (panelButton->id) {
|
||||
case kTextOK:
|
||||
case kTextOK:
|
||||
setMode(kPanelMain);
|
||||
break;
|
||||
}
|
||||
@ -827,6 +825,9 @@ void Interface::processTextInput(uint16 ascii) {
|
||||
textInputStartRepeat(ascii);
|
||||
|
||||
switch (ascii) {
|
||||
case(27): // esc
|
||||
_textInput = false;
|
||||
break;
|
||||
case(8): // backspace
|
||||
if (_textInputPos <= 1) {
|
||||
break;
|
||||
@ -947,6 +948,9 @@ void Interface::handleSaveUpdate(const Point& mousePoint) {
|
||||
bool releasedButton;
|
||||
|
||||
_savePanel.currentButton = saveHitTest(mousePoint);
|
||||
|
||||
validateSaveButtons();
|
||||
|
||||
releasedButton = (_savePanel.currentButton != NULL) &&
|
||||
(_savePanel.currentButton->state > 0) && (!_vm->mouseButtonPressed());
|
||||
|
||||
@ -961,8 +965,10 @@ void Interface::handleSaveUpdate(const Point& mousePoint) {
|
||||
|
||||
void Interface::handleSaveClick(const Point& mousePoint) {
|
||||
_savePanel.currentButton = saveHitTest(mousePoint);
|
||||
|
||||
validateSaveButtons();
|
||||
|
||||
_savePanel.zeroAllButtonState();
|
||||
_savePanel.zeroAllButtonState();
|
||||
|
||||
if (_savePanel.currentButton == NULL) {
|
||||
_textInput = false;
|
||||
@ -976,18 +982,41 @@ void Interface::handleSaveClick(const Point& mousePoint) {
|
||||
}
|
||||
|
||||
void Interface::setSave(PanelButton *panelButton) {
|
||||
/* _savePanel.currentButton = NULL;
|
||||
_savePanel.currentButton = NULL;
|
||||
uint titleNumber;
|
||||
char *fileName;
|
||||
switch (panelButton->id) {
|
||||
case kTextOK:
|
||||
setMode(kPanelMain);
|
||||
case kTextSave:
|
||||
if (_textInputStringLength == 0 ) {
|
||||
break;
|
||||
}
|
||||
if (!_vm->isSaveListFull() && (_optionSaveFileTitleNumber == 0)) {
|
||||
if (_vm->locateSaveFile(_textInputString, titleNumber)) {
|
||||
fileName = _vm->calcSaveFileName(_vm->getSaveFile(titleNumber)->slotNumber);
|
||||
_vm->save(fileName, _textInputString);
|
||||
_optionSaveFileTitleNumber = titleNumber;
|
||||
} else {
|
||||
fileName = _vm->calcSaveFileName(_vm->getNewSaveSlotNumber());
|
||||
_vm->save(fileName, _textInputString);
|
||||
_vm->fillSaveList();
|
||||
calcOptionSaveSlider();
|
||||
}
|
||||
} else {
|
||||
fileName = _vm->calcSaveFileName(_vm->getSaveFile(_optionSaveFileTitleNumber)->slotNumber);
|
||||
_vm->save(fileName, _textInputString);
|
||||
}
|
||||
setMode(kPanelOption);
|
||||
break;
|
||||
}*/
|
||||
case kTextCancel:
|
||||
setMode(kPanelOption);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Interface::handleOptionUpdate(const Point& mousePoint) {
|
||||
int16 mouseY;
|
||||
Rect rect;
|
||||
int totalFiles = _vm->getSaveFileNameCount();
|
||||
int totalFiles = _vm->getSaveFilesCount();
|
||||
int visibleFiles = _vm->getDisplayInfo().optionSaveFileVisible;
|
||||
bool releasedButton;
|
||||
|
||||
@ -1004,12 +1033,15 @@ void Interface::handleOptionUpdate(const Point& mousePoint) {
|
||||
(_optionSaveFileSlider->height - _optionSaveRectSlider.height());
|
||||
}
|
||||
|
||||
_optionSaveFileTop = clamp(0, _optionSaveFileTop, _vm->getSaveFileNameCount() - _vm->getDisplayInfo().optionSaveFileVisible);
|
||||
_optionSaveFileTop = clamp(0, _optionSaveFileTop, _vm->getSaveFilesCount() - _vm->getDisplayInfo().optionSaveFileVisible);
|
||||
calcOptionSaveSlider();
|
||||
}
|
||||
}
|
||||
|
||||
_optionPanel.currentButton = optionHitTest(mousePoint);
|
||||
|
||||
validateOptionButtons();
|
||||
|
||||
releasedButton = (_optionPanel.currentButton != NULL) && (_optionPanel.currentButton->state > 0) && (!_vm->mouseButtonPressed());
|
||||
|
||||
if (!_vm->mouseButtonPressed()) {
|
||||
@ -1026,6 +1058,8 @@ void Interface::handleOptionClick(const Point& mousePoint) {
|
||||
Rect rect;
|
||||
_optionPanel.currentButton = optionHitTest(mousePoint);
|
||||
|
||||
validateOptionButtons();
|
||||
|
||||
_optionPanel.zeroAllButtonState();
|
||||
|
||||
if (_optionPanel.currentButton == NULL) {
|
||||
@ -1039,14 +1073,14 @@ void Interface::handleOptionClick(const Point& mousePoint) {
|
||||
if ((_optionSaveRectBottom.height() > 0) && (mousePoint.y >= _optionSaveRectBottom.top)) {
|
||||
_optionSaveFileTop += _vm->getDisplayInfo().optionSaveFileVisible;
|
||||
} else {
|
||||
if (_vm->getDisplayInfo().optionSaveFileVisible < _vm->getSaveFileNameCount()) {
|
||||
if (_vm->getDisplayInfo().optionSaveFileVisible < _vm->getSaveFilesCount()) {
|
||||
_optionSaveFileMouseOff = mousePoint.y - _optionSaveRectSlider.top;
|
||||
_optionPanel.currentButton->state = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_optionSaveFileTop = clamp(0, _optionSaveFileTop, _vm->getSaveFileNameCount() - _vm->getDisplayInfo().optionSaveFileVisible);
|
||||
_optionSaveFileTop = clamp(0, _optionSaveFileTop, _vm->getSaveFilesCount() - _vm->getDisplayInfo().optionSaveFileVisible);
|
||||
calcOptionSaveSlider();
|
||||
} else {
|
||||
if (_optionPanel.currentButton == _optionSaveFilePanel) {
|
||||
@ -1057,8 +1091,8 @@ void Interface::handleOptionClick(const Point& mousePoint) {
|
||||
_optionSaveFileTitleNumber = _vm->getDisplayInfo().optionSaveFileVisible - 1;
|
||||
}
|
||||
_optionSaveFileTitleNumber += _optionSaveFileTop;
|
||||
if (_optionSaveFileTitleNumber >= _vm->getSaveFileNameCount()) {
|
||||
_optionSaveFileTitleNumber = _vm->getSaveFileNameCount() - 1;
|
||||
if (_optionSaveFileTitleNumber >= _vm->getSaveFilesCount()) {
|
||||
_optionSaveFileTitleNumber = _vm->getSaveFilesCount() - 1;
|
||||
}
|
||||
} else {
|
||||
_optionPanel.currentButton->state = 1;
|
||||
@ -1068,21 +1102,32 @@ void Interface::handleOptionClick(const Point& mousePoint) {
|
||||
|
||||
|
||||
void Interface::setOption(PanelButton *panelButton) {
|
||||
char * fileName;
|
||||
_optionPanel.currentButton = NULL;
|
||||
switch (panelButton->id) {
|
||||
case kTextContinuePlaying:
|
||||
setMode(kPanelMain);
|
||||
break;
|
||||
setMode(kPanelMain);
|
||||
break;
|
||||
case kTextQuitGame:
|
||||
setMode(kPanelQuit);
|
||||
break;
|
||||
case kTextLoad:
|
||||
//todo: load
|
||||
setMode(kPanelLoad);
|
||||
break;
|
||||
setMode(kPanelQuit);
|
||||
break;
|
||||
case kTextLoad:
|
||||
if (_vm->getSaveFilesCount() > 0) {
|
||||
if (_vm->isSaveListFull() || (_optionSaveFileTitleNumber > 0)) {
|
||||
fileName = _vm->calcSaveFileName(_vm->getSaveFile(_optionSaveFileTitleNumber)->slotNumber);
|
||||
_vm->load(fileName);
|
||||
setMode(kPanelLoad);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case kTextSave:
|
||||
setMode(kPanelSave);
|
||||
break;
|
||||
if (!_vm->isSaveListFull() && (_optionSaveFileTitleNumber == 0)) {
|
||||
_textInputString[0] = 0;
|
||||
} else {
|
||||
strcpy(_textInputString, _vm->getSaveFile(_optionSaveFileTitleNumber)->name);
|
||||
}
|
||||
setMode(kPanelSave);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -321,6 +321,22 @@ private:
|
||||
}
|
||||
return _verbTypeToPanelButton[verb];
|
||||
}
|
||||
|
||||
void validateOptionButtons() {
|
||||
if (!_vm->isSaveListFull() && (_optionSaveFileTitleNumber == 0) && (_optionPanel.currentButton != NULL)) {
|
||||
if (_optionPanel.currentButton->id == kTextLoad) {
|
||||
_optionPanel.currentButton = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
void validateSaveButtons() {
|
||||
if ((_textInputStringLength == 0) && (_savePanel.currentButton != NULL)) {
|
||||
if (_savePanel.currentButton->id == kTextSave) {
|
||||
_savePanel.currentButton = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
SagaEngine *_vm;
|
||||
|
||||
|
34
saga/saga.h
34
saga/saga.h
@ -456,6 +456,11 @@ struct GameDescription {
|
||||
}
|
||||
};
|
||||
|
||||
struct SaveFileData {
|
||||
char name[SAVE_TITLE_SIZE];
|
||||
uint slotNumber;
|
||||
};
|
||||
|
||||
|
||||
inline int ticksToMSec(int tick) {
|
||||
return tick * 1000 / kScriptTimeTicksPerSecond;
|
||||
@ -503,22 +508,20 @@ public:
|
||||
virtual ~SagaEngine();
|
||||
void shutDown() { _quit = true; }
|
||||
|
||||
void save() { //TODO: remove
|
||||
save("iteSCUMMVM.sav", "default");
|
||||
}
|
||||
void load() { //TODO: remove
|
||||
load("iteSCUMMVM.sav");
|
||||
}
|
||||
void save(const char *fileName, const char *saveName);
|
||||
void load(const char *fileName);
|
||||
void fillSaveList();
|
||||
char *calcSaveFileName(uint slotNumber);
|
||||
char *getSaveFileName(uint idx);
|
||||
bool saveListFull() const {
|
||||
return _saveFileNamesMaxCount == _saveFileNamesCount;
|
||||
|
||||
SaveFileData *getSaveFile(uint idx);
|
||||
uint getSaveSlotNumber(uint idx);
|
||||
uint getNewSaveSlotNumber();
|
||||
bool locateSaveFile(char *saveName, uint &titleNumber);
|
||||
bool isSaveListFull() const {
|
||||
return _saveFilesMaxCount == _saveFilesCount;
|
||||
}
|
||||
uint getSaveFileNameCount() const {
|
||||
return saveListFull() ? _saveFileNamesCount : _saveFileNamesCount + 1;
|
||||
uint getSaveFilesCount() const {
|
||||
return isSaveListFull() ? _saveFilesCount : _saveFilesCount + 1;
|
||||
}
|
||||
|
||||
int _soundEnabled;
|
||||
@ -595,9 +598,12 @@ public:
|
||||
|
||||
private:
|
||||
Common::String _targetName;
|
||||
uint _saveFileNamesMaxCount;
|
||||
uint _saveFileNamesCount;
|
||||
char _saveFileNames[MAX_SAVES][SAVE_TITLE_SIZE];
|
||||
|
||||
uint _saveFilesMaxCount;
|
||||
uint _saveFilesCount;
|
||||
SaveFileData _saveFiles[MAX_SAVES];
|
||||
bool _saveMarks[MAX_SAVES];
|
||||
|
||||
Point _mousePos;
|
||||
bool _leftMouseButtonPressed;
|
||||
bool _rightMouseButtonPressed;
|
||||
|
@ -48,7 +48,9 @@ struct SaveGameHeader {
|
||||
char name[SAVE_TITLE_SIZE];
|
||||
};
|
||||
|
||||
static char emptySlot[] = "[New Save Game]";
|
||||
static SaveFileData emptySlot = {
|
||||
"[New Save Game]", 0
|
||||
};
|
||||
|
||||
//TODO:
|
||||
// - delete savegame
|
||||
@ -59,42 +61,72 @@ char* SagaEngine::calcSaveFileName(uint slotNumber) {
|
||||
return name;
|
||||
}
|
||||
|
||||
char *SagaEngine::getSaveFileName(uint idx) {
|
||||
if (idx >= MAX_SAVES) {
|
||||
SaveFileData *SagaEngine::getSaveFile(uint idx) {
|
||||
if (idx >= _saveFilesMaxCount) {
|
||||
error("getSaveFileName wrong idx");
|
||||
}
|
||||
if (saveListFull()) {
|
||||
return _saveFileNames[idx];
|
||||
if (isSaveListFull()) {
|
||||
return &_saveFiles[_saveFilesCount - idx - 1];
|
||||
} else {
|
||||
return (idx == 0) ? emptySlot : _saveFileNames[idx - 1];
|
||||
return (idx == 0) ? &emptySlot : &_saveFiles[_saveFilesCount - idx];
|
||||
}
|
||||
}
|
||||
|
||||
bool SagaEngine::locateSaveFile(char *saveName, uint &titleNumber) {
|
||||
uint i;
|
||||
for (i = 0; i < _saveFilesCount; i++) {
|
||||
if (strcmp(saveName, _saveFiles[i].name) == 0) {
|
||||
if (isSaveListFull()) {
|
||||
titleNumber = _saveFilesCount - i - 1;
|
||||
} else {
|
||||
titleNumber = _saveFilesCount - i;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
uint SagaEngine::getNewSaveSlotNumber() {
|
||||
uint i;
|
||||
uint saveCount;
|
||||
if (isSaveListFull()) {
|
||||
error("getNewSaveSlotNumber save list is full");
|
||||
}
|
||||
i = 0;
|
||||
saveCount = 0;
|
||||
while (saveCount < _saveFilesCount) {
|
||||
if (_saveMarks[i++]) {
|
||||
saveCount++;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
void SagaEngine::fillSaveList() {
|
||||
int i;
|
||||
bool marks[MAX_SAVES];
|
||||
Common::InSaveFile *in;
|
||||
SaveGameHeader header;
|
||||
char *name;
|
||||
|
||||
name = calcSaveFileName(MAX_SAVES);
|
||||
name[strlen(name) - 2] = 0;
|
||||
_saveFileMan->listSavefiles(name, marks, MAX_SAVES);
|
||||
_saveFileMan->listSavefiles(name, _saveMarks, MAX_SAVES);
|
||||
|
||||
_saveFileNamesMaxCount = 0;
|
||||
_saveFilesMaxCount = 0;
|
||||
for (i = 0; i < MAX_SAVES; i++) {
|
||||
if (marks[i]) {
|
||||
_saveFileNamesMaxCount++;
|
||||
if (_saveMarks[i]) {
|
||||
_saveFilesMaxCount++;
|
||||
}
|
||||
_saveFileNames[i][0] = 0;
|
||||
_saveFiles[i].name[0] = 0;
|
||||
_saveFiles[i].slotNumber = (uint)-1;
|
||||
}
|
||||
|
||||
_saveFileNamesCount = 0;
|
||||
_saveFilesCount = 0;
|
||||
|
||||
i = 0;
|
||||
while (i < MAX_SAVES) {
|
||||
if (marks[i]) {
|
||||
if (_saveMarks[i]) {
|
||||
name = calcSaveFileName(i);
|
||||
if (!(in = _saveFileMan->openForLoading(name))) {
|
||||
break;
|
||||
@ -104,19 +136,21 @@ void SagaEngine::fillSaveList() {
|
||||
if (header.type != MKID('SAGA')) {
|
||||
error("SagaEngine::load wrong format");
|
||||
}
|
||||
strcpy(_saveFileNames[_saveFileNamesCount], header.name);
|
||||
strcpy(_saveFiles[_saveFilesCount].name, header.name);
|
||||
_saveFiles[_saveFilesCount].slotNumber = i;
|
||||
delete in;
|
||||
_saveFileNamesCount++;
|
||||
_saveFilesCount++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_SAVES; i++) {
|
||||
sprintf(_saveFileNames[i], "test%i",i);
|
||||
}
|
||||
|
||||
_saveFileNamesCount = 14;
|
||||
|
||||
/* 4debug
|
||||
for (i = 0; i < 14; i++) {
|
||||
sprintf(_saveFiles[i].name,"test%i", i);
|
||||
_saveFiles[i].slotNumber = i;
|
||||
}
|
||||
_saveFilesCount = 14;
|
||||
_saveFilesMaxCount = 14;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
@ -200,10 +234,6 @@ void SagaEngine::load(const char *fileName) {
|
||||
_scene->clearSceneQueue();
|
||||
_scene->changeScene(insetSceneNumber, ACTOR_NO_ENTRANCE, kTransitionNoFade);
|
||||
}
|
||||
|
||||
// FIXME: When save/load screen will be implemented we should
|
||||
// call these after that screen left by user
|
||||
_interface->draw();
|
||||
}
|
||||
|
||||
} // End of namespace Saga
|
||||
|
Loading…
Reference in New Issue
Block a user