aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/saveload.cpp
diff options
context:
space:
mode:
authorNicola Mettifogo2007-12-10 20:29:51 +0000
committerNicola Mettifogo2007-12-10 20:29:51 +0000
commit0b0ec8ee00c6fb7b4c0ce2f19f0865704f5a5b4a (patch)
treea97affa481dc5d9e6429b27fdd6e00f3620d118c /engines/parallaction/saveload.cpp
parent32a3b601670e14ad48b5fa0ce548f412421f382c (diff)
downloadscummvm-rg350-0b0ec8ee00c6fb7b4c0ce2f19f0865704f5a5b4a.tar.gz
scummvm-rg350-0b0ec8ee00c6fb7b4c0ce2f19f0865704f5a5b4a.tar.bz2
scummvm-rg350-0b0ec8ee00c6fb7b4c0ce2f19f0865704f5a5b4a.zip
* Switched Nippon Safes to use new names for savefiles. User will be asked to perform conversion on engine start.
* Special files used for keeping track of completed parts of the game have been replaced by special savefile 'nippon.999'. svn-id: r29820
Diffstat (limited to 'engines/parallaction/saveload.cpp')
-rw-r--r--engines/parallaction/saveload.cpp148
1 files changed, 128 insertions, 20 deletions
diff --git a/engines/parallaction/saveload.cpp b/engines/parallaction/saveload.cpp
index cbc00dc720..2489f10447 100644
--- a/engines/parallaction/saveload.cpp
+++ b/engines/parallaction/saveload.cpp
@@ -43,6 +43,8 @@
* itself, thus breaking compatibility with the original version. Who cares anyway?
*/
+#define NUM_SAVESLOTS 10
+#define SPECIAL_SAVESLOT 999
namespace Parallaction {
@@ -75,7 +77,24 @@ public:
virtual void reflowLayout();
};
+Common::String Parallaction_ns::genSaveFileName(uint slot, bool oldStyle) {
+ assert(slot < NUM_SAVESLOTS || slot == SPECIAL_SAVESLOT);
+ char s[20];
+ sprintf(s, (oldStyle ? "game.%i" : "nippon.%.3d"), slot );
+
+ return Common::String(s);
+}
+
+Common::InSaveFile *Parallaction_ns::getInSaveFile(uint slot) {
+ Common::String name = genSaveFileName(slot);
+ return _saveFileMan->openForLoading(name.c_str());
+}
+
+Common::OutSaveFile *Parallaction_ns::getOutSaveFile(uint slot) {
+ Common::String name = genSaveFileName(slot);
+ return _saveFileMan->openForSaving(name.c_str());
+}
void Parallaction_ns::doLoadGame(uint16 slot) {
@@ -87,17 +106,14 @@ void Parallaction_ns::doLoadGame(uint16 slot) {
_introSarcData3 = 200;
_introSarcData2 = 1;
- char filename[PATH_LEN];
- sprintf(filename, "game.%i", slot);
-
- Common::InSaveFile *f = _saveFileMan->openForLoading(filename);
+ Common::InSaveFile *f = getInSaveFile(slot);
if (!f) return;
- char s[30];
+ char s[200];
char n[16];
char l[16];
- f->readLine(s, 29);
+ f->readLine(s, 199);
f->readLine(n, 15);
@@ -169,24 +185,22 @@ void Parallaction_ns::doLoadGame(uint16 slot) {
void Parallaction_ns::doSaveGame(uint16 slot, const char* name) {
- char path[PATH_LEN];
- sprintf(path, "game.%i", slot);
-
- Common::OutSaveFile *f = _saveFileMan->openForSaving(path);
+ Common::OutSaveFile *f = getOutSaveFile(slot);
if (f == 0) {
char buf[32];
- sprintf(buf, "Can't save game in slot %i\n\n(%s)", slot, path);
+ sprintf(buf, "Can't save game in slot %i\n\n", slot);
GUI::MessageDialog dialog(buf);
dialog.runModal();
return;
}
- char s[30];
+ char s[200];
+ memset(s, 0, sizeof(s));
if (!name || name[0] == '\0') {
sprintf(s, "default_%i", slot);
} else {
- strncpy(s, name, 29);
+ strncpy(s, name, 199);
}
f->writeString(s);
@@ -327,19 +341,16 @@ void SaveLoadChooser::reflowLayout() {
int Parallaction_ns::buildSaveFileList(Common::StringList& l) {
- char name[16];
- char buf[30];
+ char buf[200];
int count = 0;
- for (int i = 0; i < 10; i++) {
- sprintf(name, "game.%i", i);
-
+ for (int i = 0; i < NUM_SAVESLOTS; i++) {
buf[0] = '\0';
- Common::InSaveFile *f = _saveFileMan->openForLoading(name);
+ Common::InSaveFile *f = getInSaveFile(i);
if (f) {
- f->readLine(buf, 29);
+ f->readLine(buf, 199);
delete f;
count++;
@@ -411,7 +422,104 @@ bool Parallaction_ns::saveGame() {
}
+void Parallaction_ns::setPartComplete(const Character& character) {
+ char buf[30];
+ bool alreadyPresent = false;
+
+ memset(buf, 0, sizeof(buf));
+
+ Common::InSaveFile *inFile = getInSaveFile(SPECIAL_SAVESLOT);
+ if (inFile) {
+ inFile->readLine(buf, 29);
+ delete inFile;
+
+ if (strstr(buf, character.getBaseName())) {
+ alreadyPresent = true;
+ }
+ }
+
+ if (!alreadyPresent) {
+ Common::OutSaveFile *outFile = getOutSaveFile(SPECIAL_SAVESLOT);
+ outFile->writeString(buf);
+ outFile->writeString(character.getBaseName());
+ outFile->finalize();
+ delete outFile;
+ }
+
+ return;
+}
+
+bool Parallaction_ns::allPartsComplete() {
+ char buf[30];
+
+ Common::InSaveFile *inFile = getInSaveFile(SPECIAL_SAVESLOT);
+ inFile->readLine(buf, 29);
+ delete inFile;
+ return strstr(buf, "dino") && strstr(buf, "donna") && strstr(buf, "dough");
+}
+
+void Parallaction_ns::renameOldSavefiles() {
+
+ bool exists[NUM_SAVESLOTS];
+ uint num = 0;
+ uint i;
+
+ for (i = 0; i < NUM_SAVESLOTS; i++) {
+ exists[i] = false;
+ Common::String name = genSaveFileName(i, true);
+ Common::InSaveFile *f = _saveFileMan->openForLoading(name.c_str());
+ if (f) {
+ exists[i] = true;
+ num++;
+ }
+ delete f;
+ }
+
+ if (num == 0) {
+ // there are no old savefiles: nothing to do
+ return;
+ }
+
+ GUI::MessageDialog dialog0(
+ "ScummVM found that you have old savefiles for Nippon Safes that should be renamed.\n"
+ "The old names are no longer supported, so you will not be able to load your games if you don't convert them.\n\n"
+ "Press OK to convert them now, otherwise you will be asked you next time.\n", "OK", "Cancel");
+
+ int choice = dialog0.runModal();
+ if (choice == 0) {
+ // user pressed cancel
+ return;
+ }
+
+ uint success = 0;
+ for (i = 0; i < NUM_SAVESLOTS; i++) {
+ if (exists[i]) {
+ Common::String oldName = genSaveFileName(i, true);
+ Common::String newName = genSaveFileName(i, false);
+ if (_saveFileMan->renameSavefile(oldName.c_str(), newName.c_str())) {
+ success++;
+ } else {
+ warning("Error %i (%s) occurred while renaming %s to %s", _saveFileMan->getError(),
+ _saveFileMan->getErrorDesc().c_str(), oldName.c_str(), newName.c_str());
+ }
+ }
+ }
+
+ char msg[200];
+ if (success == num) {
+ sprintf(msg, "ScummVM successfully converted all your savefiles.");
+ } else {
+ sprintf(msg,
+ "ScummVM printed some warnings in your console window and can't guarantee all your files have been converted.\n\n"
+ "Please report to the team.");
+ }
+
+ GUI::MessageDialog dialog1(msg);
+ dialog1.runModal();
+
+ return;
+}
} // namespace Parallaction