diff options
author | Travis Howell | 2007-05-22 10:31:51 +0000 |
---|---|---|
committer | Travis Howell | 2007-05-22 10:31:51 +0000 |
commit | 5e1af6f479588212a2e9d1407f80586659f5a9d4 (patch) | |
tree | bb6bb83f40f46451692d2cfffc1fbedd780c220b /engines/agos/saveload.cpp | |
parent | 9ef17f9dc75c2cd5fc92cd9f47310bd8700a6219 (diff) | |
download | scummvm-rg350-5e1af6f479588212a2e9d1407f80586659f5a9d4.tar.gz scummvm-rg350-5e1af6f479588212a2e9d1407f80586659f5a9d4.tar.bz2 scummvm-rg350-5e1af6f479588212a2e9d1407f80586659f5a9d4.zip |
Add load/save interface support for Elvira 2 and Waxworks.
svn-id: r26909
Diffstat (limited to 'engines/agos/saveload.cpp')
-rw-r--r-- | engines/agos/saveload.cpp | 409 |
1 files changed, 286 insertions, 123 deletions
diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp index fca7fe2c01..9d8737f23e 100644 --- a/engines/agos/saveload.cpp +++ b/engines/agos/saveload.cpp @@ -54,59 +54,6 @@ int AGOSEngine::countSaveGames() { return i; } -int AGOSEngine::displaySaveGameList(int curpos, bool load, char *dst) { - int slot, last_slot; - Common::InSaveFile *in; - - showMessageFormat("\xC"); - - memset(dst, 0, 108); - - slot = curpos; - - while (curpos + 6 > slot) { - if (!(in = _saveFileMan->openForLoading(genSaveName(slot)))) - break; - - in->read(dst, 18); - delete in; - - last_slot = slot; - if (slot < 10) { - showMessageFormat(" "); - } else if (_language == Common::HB_ISR) { - last_slot = (slot % 10) * 10; - last_slot += slot / 10; - } - - if (_language == Common::HB_ISR && !(slot % 10)) - showMessageFormat("0"); - showMessageFormat("%d", last_slot); - showMessageFormat(".%s\n", dst); - dst += 18; - slot++; - } - // while_break - if (!load) { - if (curpos + 6 == slot) - slot++; - else { - if (slot < 10) - showMessageFormat(" "); - showMessageFormat("%d.\n", slot); - } - } else { - if (curpos + 6 == slot) { - if ((in = _saveFileMan->openForLoading(genSaveName(slot)))) { - slot++; - delete in; - } - } - } - - return slot - curpos; -} - char *AGOSEngine::genSaveName(int slot) { static char buf[15]; @@ -197,15 +144,243 @@ void AGOSEngine::quickLoadOrSave() { _saveLoadType = 0; } -void AGOSEngine::listSaveGames(char *buf) { - int i; +void AGOSEngine::listSaveGames(char *dst) { + Common::InSaveFile *in; + uint y, slot; + + const uint8 num = (getGameType() == GType_WW) ? 3 : 4; disableFileBoxes(); - i = displaySaveGameList(_saveLoadRowCurPos, _saveOrLoad, buf); + WindowBlock *window = _windowArray[num]; + window->textRow = 0; + window->textColumn = 0; + window->textColumnOffset = 4; + + windowPutChar(window, 12); + + memset(dst, 0, 200); + + slot = _saveLoadRowCurPos; + for (y = 0; y < 8; y++) { + window->textColumn = 0; + window->textColumnOffset = 4; + window->textLength = 0; + if (in = _saveFileMan->openForLoading(genSaveName(slot++))) { + in->read(dst, 8); + delete in; + + const char *name = dst; + for (; *name; name++) + windowPutChar(window, *name); + + enableBox(200 + y * 3 + 0); + } + dst+= 8; + + window->textColumn = 7; + window->textColumnOffset = 4; + window->textLength = 0; + if (in = _saveFileMan->openForLoading(genSaveName(slot++))) { + in->read(dst, 8); + delete in; + + const char *name = dst; + for (; *name; name++) + windowPutChar(window, *name); + + enableBox(200 + y * 3 + 1); + } + dst+= 8; + + window->textColumn = 15; + window->textColumnOffset = 4; + window->textLength = 0; + if (in = _saveFileMan->openForLoading(genSaveName(slot++))) { + in->read(dst, 8); + delete in; + + const char *name = dst; + for (; *name; name++) + windowPutChar(window, *name); + + enableBox(200 + y * 3 + 2); + } + dst+= 8; + + windowPutChar(window, 13); + } + + window->textRow = 9; + window->textColumn = 0; + window->textColumnOffset = 4; + window->textLength = 0; +} + +void AGOSEngine::userGame(bool load) { + time_t saveTime; + int i, numSaveGames; + WindowBlock *window; + char *name; + bool b; + char buf[200]; + + _saveOrLoad = load; + + saveTime = time(NULL); + + haltAnimation(); + + numSaveGames = countSaveGames(); + _numSaveGameRows = numSaveGames; + _saveLoadRowCurPos = 1; + _saveLoadEdit = false; + + const uint8 num = (getGameType() == GType_WW) ? 3 : 4; + + listSaveGames(buf); + + name = buf + 192; + _saveGameNameLen = 0; + + if (!load) { + for (;;) { + window = _windowArray[num]; + windowPutChar(window, 127); + + _saveLoadEdit = true; + + i = userGameGetKey(&b, buf, 128); + if (b) { + if (i <= 223) { + // TODO; Run the overwrite check script in Waxworks + if (!saveGame(_saveLoadRowCurPos + i, buf + i * 8)) + fileError(_windowArray[num], true); + } + + goto get_out; + } + + userGameBackSpace(_windowArray[num], 8); + if (i == 10 || i == 13) + break; + if (i == 8) { + // do_backspace + if (_saveGameNameLen) { + _saveGameNameLen--; + name[_saveGameNameLen] = 0; + userGameBackSpace(_windowArray[num], 8); + } + } else if (i >= 32 && _saveGameNameLen != 8) { + name[_saveGameNameLen++] = i; + windowPutChar(_windowArray[num], i); + } + } + + if (!saveGame(numSaveGames, buf + 192)) + fileError(_windowArray[num], true); + } else { + i = userGameGetKey(&b, buf, 128); + if (i != 225) { + if (!loadGame(genSaveName(_saveLoadRowCurPos + i))) + fileError(_windowArray[num], false); + } + } + +get_out:; + disableFileBoxes(); + + _gameStoppedClock = time(NULL) - saveTime + _gameStoppedClock; + + restartAnimation(); +} + +int AGOSEngine::userGameGetKey(bool *b, char *buf, uint maxChar) { + HitArea *ha; + *b = true; + + _keyPressed = 0; + + for (;;) { + _lastHitArea = NULL; + _lastHitArea3 = NULL; + + do { + if (_saveLoadEdit && _keyPressed && _keyPressed < maxChar) { + *b = false; + return _keyPressed; + } + delay(10); + } while (_lastHitArea3 == 0); + + ha = _lastHitArea; + if (ha == NULL || ha->id < 200) { + } else if (ha->id == 225) { + return ha->id; + } else if (ha->id == 224) { + _saveGameNameLen = 0; + _saveLoadRowCurPos += 24; + if (_saveLoadRowCurPos >= _numSaveGameRows) + _saveLoadRowCurPos = 1; + + listSaveGames(buf); + } else if (ha->id < 224) { + return ha->id - 200; + } + } +} + +void AGOSEngine_Simon1::listSaveGames(char *dst) { + Common::InSaveFile *in; + uint i, slot, lastSlot; + + disableFileBoxes(); + + showMessageFormat("\xC"); + + memset(dst, 0, 108); + + slot = _saveLoadRowCurPos; + while (_saveLoadRowCurPos + 6 > slot) { + if (!(in = _saveFileMan->openForLoading(genSaveName(slot)))) + break; + + in->read(dst, 8); + delete in; + + lastSlot = slot; + if (slot < 10) { + showMessageFormat(" "); + } + + 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) + slot++; + else { + if (slot < 10) + showMessageFormat(" "); + showMessageFormat("%d.\n", slot); + } + } else { + if (_saveLoadRowCurPos + 6 == slot) { + if ((in = _saveFileMan->openForLoading(genSaveName(slot)))) { + slot++; + delete in; + } + } + } _saveDialogFlag = true; + i = slot - _saveLoadRowCurPos; if (i != 7) { i++; if (!_saveOrLoad) @@ -221,7 +396,6 @@ void AGOSEngine::listSaveGames(char *buf) { } while (--i); } - const byte hebrewKeyTable[96] = { 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 90, 45, 85, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 83, 83, 90, 61, 85, 63, 35, 89, 80, 65, 66, 87, @@ -231,10 +405,9 @@ const byte hebrewKeyTable[96] = { 123, 124, 125, 126, 127, }; -void AGOSEngine::userGame(bool load) { - time_t save_time; - int number_of_savegames; - int i, name_len, result; +void AGOSEngine_Simon1::userGame(bool load) { + time_t saveTime; + int i, numSaveGames, result; WindowBlock *window; char *name; bool b; @@ -243,27 +416,25 @@ void AGOSEngine::userGame(bool load) { _saveOrLoad = load; - save_time = time(NULL); + saveTime = time(NULL); - number_of_savegames = countSaveGames(); + numSaveGames = countSaveGames(); if (!load) - number_of_savegames++; - number_of_savegames -= 6; - if (number_of_savegames < 0) - number_of_savegames = 0; - number_of_savegames++; - _numSaveGameRows = number_of_savegames; + numSaveGames++; + numSaveGames -= 6; + if (numSaveGames < 0) + numSaveGames = 0; + numSaveGames++; + _numSaveGameRows = numSaveGames; _saveLoadRowCurPos = 1; if (!load) - _saveLoadRowCurPos = number_of_savegames; + _saveLoadRowCurPos = numSaveGames; _saveLoadEdit = false; restart:; - do { - i = userGameGetKey(&b, buf); - } while (!b); + i = userGameGetKey(&b, buf, maxChar); if (i == 205) goto get_out; @@ -283,22 +454,21 @@ restart:; if (_language == Common::HB_ISR) { window->textColumn = 3; window->textColumnOffset = 6; - window->textLength = 3; } else { window->textColumn = 2; window->textColumnOffset = 2; - window->textLength = 3; } + window->textLength = 3; name = buf + i * 18; // now process entire savegame name to get correct x offset for cursor - name_len = 0; - while (name[name_len]) { + _saveGameNameLen = 0; + while (name[_saveGameNameLen]) { if (_language == Common::HB_ISR) { byte width = 6; - if (name[name_len] >= 64 && name[name_len] < 91) - width = _hebrewCharWidths [name[name_len] - 64]; + if (name[_saveGameNameLen] >= 64 && name[_saveGameNameLen] < 91) + width = _hebrewCharWidths [name[_saveGameNameLen] - 64]; window->textLength++; window->textColumnOffset -= width; if (window->textColumnOffset < width) { @@ -308,43 +478,37 @@ restart:; } else { window->textLength++; window->textColumnOffset += 6; - if (name[name_len] == 'i' || name[name_len] == 'l') + if (name[_saveGameNameLen] == 'i' || name[_saveGameNameLen] == 'l') window->textColumnOffset -= 2; if (window->textColumnOffset >= 8) { window->textColumnOffset -= 8; window->textColumn++; } } - name_len++; + _saveGameNameLen++; } - // while_1_end - // do_3_start for (;;) { - windowPutChar(window, 0x7f); + windowPutChar(window, 127); _saveLoadEdit = true; - // do_2 - do { - i = userGameGetKey(&b, buf); - - if (b) { - if (i == 205) - goto get_out; - enableBox(208 + result); - if (_saveLoadEdit) { - userGameBackSpace(_windowArray[5], 8); - } - goto if_1; - } + i = userGameGetKey(&b, buf, maxChar); - // is_not_b - if (!_saveLoadEdit) { - enableBox(208 + result); - goto restart; + if (b) { + if (i == 205) + goto get_out; + enableBox(208 + result); + if (_saveLoadEdit) { + userGameBackSpace(_windowArray[5], 8); } - } while (i >= maxChar || i == 0); + goto if_1; + } + + if (!_saveLoadEdit) { + enableBox(208 + result); + goto restart; + } if (_language == Common::HB_ISR) { if (i >= 128) @@ -353,36 +517,33 @@ restart:; i = hebrewKeyTable[i - 32]; } - // after_do_2 userGameBackSpace(_windowArray[5], 8); if (i == 10 || i == 13) break; if (i == 8) { // do_backspace - if (name_len != 0) { - int x; - byte m; + if (_saveGameNameLen) { + byte m, x; - name_len--; - m = name[name_len]; + _saveGameNameLen--; + m = name[_saveGameNameLen]; if (_language == Common::HB_ISR) x = 8; else - x = (name[name_len] == 'i' || name[name_len] == 'l') ? 1 : 8; + x = (name[_saveGameNameLen] == 'i' || name[_saveGameNameLen] == 'l') ? 1 : 8; - name[name_len] = 0; + name[_saveGameNameLen] = 0; userGameBackSpace(_windowArray[5], x, m); } - } else if (i >= 32 && name_len != 17) { - name[name_len++] = i; + } else if (i >= 32 && _saveGameNameLen != 17) { + name[_saveGameNameLen++] = i; windowPutChar(_windowArray[5], i); } } - // do_save if (!saveGame(_saveLoadRowCurPos + result, buf + result * 18)) fileError(_windowArray[5], true); } else { @@ -393,15 +554,10 @@ restart:; get_out:; disableFileBoxes(); - _gameStoppedClock = time(NULL) - save_time + _gameStoppedClock; - - i = _timer4; - do { - delay(10); - } while (i == _timer4); + _gameStoppedClock = time(NULL) - saveTime + _gameStoppedClock; } -int AGOSEngine::userGameGetKey(bool *b, char *buf) { +int AGOSEngine_Simon1::userGameGetKey(bool *b, char *buf, uint maxChar) { HitArea *ha; *b = true; @@ -416,7 +572,7 @@ int AGOSEngine::userGameGetKey(bool *b, char *buf) { _lastHitArea3 = NULL; do { - if (_saveLoadEdit && _keyPressed != 0) { + if (_saveLoadEdit && _keyPressed && _keyPressed < maxChar) { *b = false; return _keyPressed; } @@ -453,8 +609,15 @@ int AGOSEngine::userGameGetKey(bool *b, char *buf) { } void AGOSEngine::disableFileBoxes() { - for (int i = 208; i != 214; i++) - disableBox(i); + int i; + + if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) { + for (i = 208; i != 214; i++) + disableBox(i); + } else { + for (i = 200; i != 224; i++) + disableBox(i); + } } void AGOSEngine::userGameBackSpace(WindowBlock *window, int x, byte b) { |