aboutsummaryrefslogtreecommitdiff
path: root/engines/agos/saveload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agos/saveload.cpp')
-rw-r--r--engines/agos/saveload.cpp253
1 files changed, 223 insertions, 30 deletions
diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp
index 1267e27daa..eb2266550a 100644
--- a/engines/agos/saveload.cpp
+++ b/engines/agos/saveload.cpp
@@ -109,7 +109,7 @@ void AGOSEngine::quickLoadOrSave() {
setBitFlag(7, false);
sub = getSubroutineByID(19);
startSubroutine(sub);
- //oe2_printStats();
+ printStats();
sub = getSubroutineByID(28);
startSubroutine(sub);
setBitFlag(17, false);
@@ -146,7 +146,171 @@ void AGOSEngine::quickLoadOrSave() {
_saveLoadType = 0;
}
-void AGOSEngine::listSaveGames(char *dst) {
+bool AGOSEngine::confirmOverWrite(WindowBlock *window) {
+ if (getGameType() == GType_WW) {
+ Subroutine *sub = getSubroutineByID(80);
+ if (sub != NULL)
+ startSubroutineEx(sub);
+
+ if (_variableArray[253] == 0)
+ return true;
+ } else if (getGameType() == GType_ELVIRA2) {
+ // Original verison never confirmed
+ return true;
+ } else if (getGameType() == GType_ELVIRA1) {
+ const char *message1, *message2, *message3;
+
+ switch (_language) {
+ case Common::FR_FRA:
+ message1 = "\rFichier d/j; existant.\r\r";
+ message2 = " Ecrire pardessus ?\r\r";
+ message3 = " Oui Non";
+ break;
+ case Common::DE_DEU:
+ message1 = "\rDatei existiert bereits.\r\r";
+ message2 = " berschreiben ?\r\r";
+ message3 = " Ja Nein";
+ break;
+ default:
+ message1 = "\r File already exists.\r\r";
+ message2 = " Overwrite it ?\r\r";
+ message3 = " Yes No";
+ break;
+ }
+
+ printScroll();
+ window->textColumn = 0;
+ window->textRow = 0;
+ window->textColumnOffset = 0;
+ window->textLength = 0; // Difference
+
+ for (; *message1; message1++)
+ windowPutChar(window, *message1);
+ for (; *message2; message2++)
+ windowPutChar(window, *message2);
+ for (; *message3; message3++)
+ windowPutChar(window, *message3);
+
+ if (confirmYesOrNo(120, 78) == 0x7FFF)
+ return true;
+ }
+
+ return false;
+}
+
+int16 AGOSEngine::matchSaveGame(const char *name, uint16 max) {
+ Common::InSaveFile *in;
+ char dst[8];
+ uint16 slot;
+
+ for (slot = 0; slot < max; slot++) {
+ if ((in = _saveFileMan->openForLoading(genSaveName(slot)))) {
+ in->read(dst, 8);
+ delete in;
+
+ if (!scumm_stricmp(name, dst)) {
+ return slot;
+ }
+ }
+ }
+
+ return -1;
+}
+
+void AGOSEngine::userGame(bool load) {
+ WindowBlock *window = _windowArray[4];
+ const char *message1;
+ int i, numSaveGames;
+ char *name;
+ char buf[8];
+
+ numSaveGames = countSaveGames();
+
+ time_t saveTime = time(NULL);
+ haltAnimation();
+
+restart:
+ printScroll();
+ window->textColumn = 0;
+ window->textRow = 0;
+ window->textColumnOffset = 0;
+ window->textLength = 0; // Difference
+
+ switch (_language) {
+ case Common::FR_FRA:
+ message1 = "\rIns/rez disquette de\rsauvegarde de jeux &\rentrez nom de fichier:\r\r ";
+ break;
+ case Common::DE_DEU:
+ message1 = "\rLege Spielstandsdiskette ein. Dateinamen eingeben:\r\r ";
+ break;
+ default:
+ message1 = "\r Insert savegame data disk & enter filename:\r\r ";
+ break;
+ }
+
+ for (; *message1; message1++)
+ windowPutChar(window, *message1);
+
+ memset(buf, 0, 8);
+ name = buf;
+ _saveGameNameLen = 0;
+
+ for (;;) {
+ windowPutChar(window, 128);
+ _keyPressed = 0;
+
+ for (;;) {
+ delay(10);
+ if (_keyPressed && _keyPressed < 128) {
+ i = _keyPressed;
+ break;
+ }
+ }
+
+ userGameBackSpace(_windowArray[4], 8);
+ if (i == 10 || i == 13) {
+ break;
+ } else if (i == 8) {
+ // do_backspace
+ if (_saveGameNameLen) {
+ _saveGameNameLen--;
+ name[_saveGameNameLen] = 0;
+ userGameBackSpace(_windowArray[4], 8);
+ }
+ } else if (i >= 32 && _saveGameNameLen != 8) {
+ name[_saveGameNameLen++] = i;
+ windowPutChar(_windowArray[4], i);
+ }
+ }
+
+ if (_saveGameNameLen != 0) {
+ int16 slot = matchSaveGame(name, numSaveGames);
+ if (!load) {
+ if (slot >= 0 && !confirmOverWrite(window))
+ goto restart;
+
+ if (slot < 0)
+ slot = numSaveGames;
+
+ if (!saveGame(slot, name))
+ fileError(_windowArray[4], true);
+ } else {
+ if (slot < 0) {
+ fileError(_windowArray[4], false);
+ } else {
+ if (!loadGame(genSaveName(slot)))
+ fileError(_windowArray[4], false);
+ }
+ }
+
+ printStats();
+ }
+
+ restartAnimation();
+ _gameStoppedClock = time(NULL) - saveTime + _gameStoppedClock;
+}
+
+void AGOSEngine_Elvira2::listSaveGames(char *dst) {
Common::InSaveFile *in;
uint y, slot;
@@ -166,7 +330,7 @@ void AGOSEngine::listSaveGames(char *dst) {
slot = _saveLoadRowCurPos;
for (y = 0; y < 8; y++) {
window->textColumn = 0;
- window->textColumnOffset = 4;
+ window->textColumnOffset = (getGameType() == GType_ELVIRA2) ? 4 : 0;
window->textLength = 0;
if ((in = _saveFileMan->openForLoading(genSaveName(slot++)))) {
in->read(dst, 8);
@@ -180,8 +344,13 @@ void AGOSEngine::listSaveGames(char *dst) {
}
dst+= 8;
- window->textColumn = 7;
- window->textColumnOffset = 4;
+ if (getGameType() == GType_WW) {
+ window->textColumn = 7;
+ window->textColumnOffset = 4;
+ } else if (getGameType() == GType_ELVIRA2) {
+ window->textColumn = 8;
+ window->textColumnOffset = 0;
+ }
window->textLength = 0;
if ((in = _saveFileMan->openForLoading(genSaveName(slot++)))) {
in->read(dst, 8);
@@ -196,7 +365,7 @@ void AGOSEngine::listSaveGames(char *dst) {
dst+= 8;
window->textColumn = 15;
- window->textColumnOffset = 4;
+ window->textColumnOffset = (getGameType() == GType_ELVIRA2) ? 4 : 0;
window->textLength = 0;
if ((in = _saveFileMan->openForLoading(genSaveName(slot++)))) {
in->read(dst, 8);
@@ -221,7 +390,7 @@ void AGOSEngine::listSaveGames(char *dst) {
_saveGameNameLen = 0;
}
-void AGOSEngine::userGame(bool load) {
+void AGOSEngine_Elvira2::userGame(bool load) {
time_t saveTime;
int i, numSaveGames;
char *name;
@@ -246,6 +415,8 @@ void AGOSEngine::userGame(bool load) {
if (!load) {
WindowBlock *window = _windowArray[num];
+ int16 slot = -1;
+
name = buf + 192;
for (;;) {
@@ -256,15 +427,9 @@ void AGOSEngine::userGame(bool load) {
i = userGameGetKey(&b, buf, 128);
if (b) {
if (i <= 223) {
- if (getGameType() == GType_WW) {
- Subroutine *sub = getSubroutineByID(80);
- if (sub != NULL)
- startSubroutineEx(sub);
-
- if (_variableArray[253] != 0) {
- listSaveGames(buf);
- continue;
- }
+ if (!confirmOverWrite(window)) {
+ listSaveGames(buf);
+ continue;
}
if (!saveGame(_saveLoadRowCurPos + i, buf + i * 8))
@@ -275,9 +440,16 @@ void AGOSEngine::userGame(bool load) {
}
userGameBackSpace(_windowArray[num], 8);
- if (i == 10 || i == 13)
+ if (i == 10 || i == 13) {
+ slot = matchSaveGame(name, numSaveGames);
+ if (slot >= 0) {
+ if (!confirmOverWrite(window)) {
+ listSaveGames(buf);
+ continue;
+ }
+ }
break;
- if (i == 8) {
+ } else if (i == 8) {
// do_backspace
if (_saveGameNameLen) {
_saveGameNameLen--;
@@ -290,8 +462,13 @@ void AGOSEngine::userGame(bool load) {
}
}
- if (!saveGame(numSaveGames, buf + 192))
- fileError(_windowArray[num], true);
+ if (_saveGameNameLen != 0) {
+ if (slot < 0)
+ slot = numSaveGames;
+
+ if (!saveGame(slot, buf + 192))
+ fileError(_windowArray[num], true);
+ }
} else {
i = userGameGetKey(&b, buf, 128);
if (i != 225) {
@@ -309,7 +486,7 @@ get_out:;
restartAnimation();
}
-int AGOSEngine::userGameGetKey(bool *b, char *buf, uint maxChar) {
+int AGOSEngine_Elvira2::userGameGetKey(bool *b, char *buf, uint maxChar) {
HitArea *ha;
*b = true;
@@ -359,26 +536,29 @@ void AGOSEngine_Simon1::listSaveGames(char *dst) {
if (!(in = _saveFileMan->openForLoading(genSaveName(slot))))
break;
- in->read(dst, 8);
+ in->read(dst, 18);
delete in;
lastSlot = slot;
if (slot < 10) {
showMessageFormat(" ");
+ } else if (_language == Common::HB_ISR) {
+ lastSlot = (slot % 10) * 10;
+ lastSlot += slot / 10;
}
+ showMessageFormat("%d", lastSlot);
if (_language == Common::HB_ISR && !(slot % 10))
showMessageFormat("0");
- showMessageFormat("%d", lastSlot);
showMessageFormat(".%s\n", dst);
dst += 18;
slot++;
}
if (!_saveOrLoad) {
- if (_saveLoadRowCurPos + 6 == slot)
+ if (_saveLoadRowCurPos + 6 == slot) {
slot++;
- else {
+ } else {
if (slot < 10)
showMessageFormat(" ");
showMessageFormat("%d.\n", slot);
@@ -532,9 +712,9 @@ restart:;
}
userGameBackSpace(_windowArray[5], 8);
- if (i == 10 || i == 13)
+ if (i == 10 || i == 13) {
break;
- if (i == 8) {
+ } else if (i == 8) {
// do_backspace
if (_saveGameNameLen) {
byte m, x;
@@ -732,7 +912,16 @@ void AGOSEngine::fileError(WindowBlock *window, bool save_error) {
}
}
- windowPutChar(window, 0xC);
+ if (getGameType() == GType_ELVIRA1) {
+ printScroll();
+ window->textColumn = 0;
+ window->textRow = 0;
+ window->textColumnOffset = 0;
+ window->textLength = 0; // Difference
+ } else {
+ windowPutChar(window, 12);
+ }
+
for (; *message1; message1++)
windowPutChar(window, *message1);
for (; *message2; message2++)
@@ -954,7 +1143,9 @@ bool AGOSEngine_Elvira2::loadGame(const char *filename, bool restartMode) {
return false;
}
- if (getGameType() == GType_FF) {
+ if (getGameType() == GType_PP) {
+ // No caption
+ } else if (getGameType() == GType_FF) {
f->read(ident, 100);
} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
f->read(ident, 18);
@@ -1104,7 +1295,9 @@ bool AGOSEngine_Elvira2::saveGame(uint slot, const char *caption) {
return false;
}
- if (getGameType() == GType_FF) {
+ if (getGameType() == GType_PP) {
+ // No caption
+ } else if (getGameType() == GType_FF) {
f->write(caption, 100);
curTime = time(NULL);
} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {