aboutsummaryrefslogtreecommitdiff
path: root/sky
diff options
context:
space:
mode:
authorTorbjörn Andersson2004-07-18 18:25:16 +0000
committerTorbjörn Andersson2004-07-18 18:25:16 +0000
commite02e6408f25b1d683b06cef1d83b389a8d43aa89 (patch)
tree58bc0007f18c57ec647a93cb62967fc0e07beddc /sky
parent0e2c7d6d7fab0fde7a00e57a625ddae9eaadbe2d (diff)
downloadscummvm-rg350-e02e6408f25b1d683b06cef1d83b389a8d43aa89.tar.gz
scummvm-rg350-e02e6408f25b1d683b06cef1d83b389a8d43aa89.tar.bz2
scummvm-rg350-e02e6408f25b1d683b06cef1d83b389a8d43aa89.zip
Adapted Fingolfin's BS1 code for better error messages when save/restore
fails. The downside to this is that while the error dialog is showing, the mouse cursor is drawn in dark greys, so it's almost invisible. svn-id: r14260
Diffstat (limited to 'sky')
-rw-r--r--sky/control.cpp40
-rw-r--r--sky/control.h2
2 files changed, 29 insertions, 13 deletions
diff --git a/sky/control.cpp b/sky/control.cpp
index 91b775ece3..70180b444e 100644
--- a/sky/control.cpp
+++ b/sky/control.cpp
@@ -22,6 +22,7 @@
#include "common/file.h"
#include "common/util.h"
#include "common/system.h"
+#include "gui/message.h"
#include "sky/compact.h"
#include "sky/control.h"
#include "sky/disk.h"
@@ -883,13 +884,7 @@ uint16 Control::saveRestorePanel(bool allowSave) {
refreshNames = true;
}
if (clickRes == NO_DISK_SPACE) {
- // HACK: The error dialog will have two buttons, one
- // for yes and one for no. And we just won't care
- // which one the user presses. As far as I can tell,
- // making a proper dialog is tricky, since the yes/no
- // buttons are actually one single sprite.
- char saveFailed[] = "Could not save!";
- getYesNo(saveFailed);
+ displayMessage(0, "Could not save game in directory '%s'", _savePath);
quitPanel = true;
}
if ((clickRes == CANCEL_PRESSED) || (clickRes == GAME_RESTORED))
@@ -1051,6 +1046,24 @@ bool Control::loadSaveAllowed(void) {
return true;
}
+int Control::displayMessage(const char *altButton, const char *message, ...) {
+#ifdef __PALM_OS__
+ char buf[256]; // 1024 is too big overflow the stack
+#else
+ char buf[1024];
+#endif
+ va_list va;
+
+ va_start(va, message);
+ vsprintf(buf, message, va);
+ va_end(va);
+
+ GUI::MessageDialog dialog(buf, "OK", altButton);
+ int result = dialog.runModal();
+ _skyMouse->spriteMouse(MOUSE_NORMAL, 0, 0);
+ return result;
+}
+
void Control::saveDescriptions(uint8 *srcBuf) {
uint8 *tmpBuf = (uint8 *)malloc(MAX_SAVE_GAMES * MAX_TEXT_LEN);
@@ -1089,14 +1102,15 @@ void Control::doAutoSave(void) {
outf = _saveFileMan->open_savefile(fName, _savePath, true);
if (outf == NULL) {
- warning("Can't create file %s for autosaving", fName);
+ displayMessage(0, "Untable to create autosave file '%s' in directory '%s'", fName, _savePath);
return;
}
uint8 *saveData = (uint8 *)malloc(0x20000);
uint32 fSize = prepareSaveData(saveData);
if (outf->write(saveData, fSize) != fSize)
- warning("Can't write file %s for autosaving. Disk full?", fName);
+ displayMessage(0, "Unable to write autosave file '%s' in directory '%s'. Disk full?", fName, _savePath);
+
delete outf;
free(saveData);
}
@@ -1429,12 +1443,12 @@ uint16 Control::parseSaveData(uint8 *srcBuf) {
LODSD(srcPos, size);
LODSD(srcPos, saveRev);
if (saveRev > SAVE_FILE_REVISION) {
- warning("Unknown save file revision (%d)",saveRev);
+ displayMessage(0, "Unknown save file revision (%d)", saveRev);
return RESTORE_FAILED;
}
if (saveRev <= OLD_SAVEGAME_TYPE) {
- warning("This savegame version is unsupported.");
+ displayMessage(0, "This savegame version is unsupported.");
return RESTORE_FAILED;
}
uint32 music, mouseType, palette, gameVersion;
@@ -1521,7 +1535,7 @@ uint16 Control::restoreGameFromFile(bool autoSave) {
*(uint32 *)saveData = TO_LE_32(infSize);
if (inf->read(saveData+4, infSize-4) != infSize-4) {
- warning("Can't read from file!");
+ displayMessage("Can't read from file '%s'", fName);
free(saveData);
delete inf;
return RESTORE_FAILED;
@@ -1551,7 +1565,7 @@ uint16 Control::quickXRestore(uint16 slot) {
_skyScreen->setPalette(60510);
_savedMouse = _skyMouse->giveCurrentMouseType();
- _skyMouse->spriteMouse(MOUSE_NORMAL,0,0);
+ _skyMouse->spriteMouse(MOUSE_NORMAL, 0, 0);
if (slot == 0)
result = restoreGameFromFile(true);
diff --git a/sky/control.h b/sky/control.h
index 8a29df20e7..fcc1b5907e 100644
--- a/sky/control.h
+++ b/sky/control.h
@@ -185,6 +185,8 @@ public:
bool loadSaveAllowed(void);
private:
+ int displayMessage(const char *altButton, const char *message, ...);
+
void initPanel(void);
void removePanel(void);