Ticket #8624: dialog_save.2.patch

File dialog_save.2.patch, 5.4 KB (added by Kirben, 14 years ago)

Patch for current SVN

  • engines/scumm/input.cpp

     
    499499
    500500        // Alt-F5 brings up the original save/load dialog.
    501501
    502         if (lastKeyHit == 440 && _game.version > 2 && _game.version < 8) {
    503                 lastKeyHit = saveloadkey;
    504                 saveloadkey = -1;
     502        if (lastKeyHit == 440) {
     503                if(_game.version <= 3)
     504                        prepareSavegame();
     505                if(_game.version > 2 && _game.version < 8) {
     506                        lastKeyHit = saveloadkey;
     507                        saveloadkey = -1;
     508                }
    505509        }
    506510
    507511        if (lastKeyHit == saveloadkey) {
  • engines/scumm/scumm.h

     
    330330
    331331enum ResIds {
    332332        RESID_IQ_EPISODE = 7,
    333         RESID_IQ_SERIES = 9
     333        RESID_IQ_SERIES = 9,
     334        RESID_SAVENAME1 = 10,
     335        RESID_SAVENAME1_LOOM = 9
    334336};
    335337
    336338
     
    624626        void requestSave(int slot, const char *name, bool temporary = false);
    625627        void requestLoad(int slot);
    626628
     629        void prepareSavegame();
     630        bool savePreparedSavegame(int slot, char *desc);
     631        bool copyRenameSavegame(int oldSlot, bool oldTemporary, int newSlot, bool newTemporary, char *desc);
     632
    627633// thumbnail + info stuff
    628634public:
    629635        Graphics::Surface *loadThumbnailFromSlot(int slot);
  • engines/scumm/saveload.cpp

     
    8484        _saveLoadFlag = 2;              // 2 for load
    8585}
    8686
     87static bool saveSaveGameHeader(Common::OutSaveFile *out, SaveGameHeader &hdr) {
     88        hdr.type = MKID_BE('SCVM');
     89        hdr.size = 0;
     90        hdr.ver = CURRENT_VER;
     91
     92        out->writeUint32BE(hdr.type);
     93        out->writeUint32LE(hdr.size);
     94        out->writeUint32LE(hdr.ver);
     95        out->write(hdr.name, sizeof(hdr.name));
     96        return true;
     97}
     98
    8799bool ScummEngine::saveState(int slot, bool compat) {
    88100        char filename[256];
    89101        Common::OutSaveFile *out;
     
    95107                return false;
    96108
    97109        memcpy(hdr.name, _saveLoadName, sizeof(hdr.name));
    98 
    99         hdr.type = MKID_BE('SCVM');
    100         hdr.size = 0;
    101         hdr.ver = CURRENT_VER;
    102 
    103         out->writeUint32BE(hdr.type);
    104         out->writeUint32LE(hdr.size);
    105         out->writeUint32LE(hdr.ver);
    106         out->write(hdr.name, sizeof(hdr.name));
     110        saveSaveGameHeader(out, hdr);
    107111        saveThumbnail(out);
    108112        saveInfos(out);
    109113
     
    429433        return true;
    430434}
    431435
     436void ScummEngine::prepareSavegame() {
     437        saveState(0, true);
     438}
     439
     440bool ScummEngine::savePreparedSavegame(int slot, char *desc) {
     441        return copyRenameSavegame(0, true, slot, false, desc);
     442}
     443
     444bool ScummEngine::copyRenameSavegame(int oldSlot, bool oldTemporary, int newSlot, bool newTemporary, char *desc) {
     445        bool result;
     446        uint32 nread;
     447        byte buffer[1024];
     448        char oldFilename[256];
     449        char newFilename[256];
     450        Common::InSaveFile *in;
     451        Common::OutSaveFile *out;
     452        SaveGameHeader hdr;
     453
     454        makeSavegameName(oldFilename, oldSlot, oldTemporary);
     455        if (!(in = _saveFileMan->openForLoading(oldFilename)))
     456                return false;
     457
     458        if (!loadSaveGameHeader(in, hdr)) {
     459                warning("Invalid savegame '%s'", oldFilename);
     460                delete in;
     461                return false;
     462        }
     463
     464        if (hdr.ver != CURRENT_VER) {
     465                warning("Incompatible savegame '%s'", oldFilename);
     466                delete in;
     467                return false;
     468        }
     469
     470        makeSavegameName(newFilename, newSlot, newTemporary);
     471        if (!(out = _saveFileMan->openForSaving(newFilename))) {
     472                delete in;
     473                return false;
     474        }
     475
     476        memset(hdr.name, 0, sizeof(hdr.name));
     477        strncpy(hdr.name, desc, sizeof(hdr.name)-1);
     478        saveSaveGameHeader(out, hdr);
     479       
     480        // copy bytes
     481        result = true;
     482        while (nread = in->read(buffer, sizeof(buffer))) {
     483                uint32 nwritten = out->write(buffer, nread);
     484                if (nwritten < nread) {
     485                        result = false;
     486                        break;
     487                }
     488        }
     489
     490        out->finalize();
     491        if (out->ioFailed()) {
     492                result = false;
     493        }
     494        delete in;
     495        delete out;
     496
     497        return result;
     498}
     499
    432500Graphics::Surface *ScummEngine::loadThumbnailFromSlot(int slot) {
    433501        char filename[256];
    434502        Common::InSaveFile *in;
  • engines/scumm/script_v5.cpp

     
    12221222                result = 100;
    12231223                break;
    12241224        case 0x20: // drive
    1225                 if (_game.id == GID_INDY3) {
    1226                         // 0 = hard drive
    1227                         // 1 = disk drive
    1228                         result = 0;
     1225                if (_game.version <= 3) {
     1226                        // 0 = ???
     1227                        // [1,2] = disk drive [A:,B:]
     1228                        // 3 = hard drive
     1229                        result = 3;
    12291230                } else {
    12301231                        // set current drive
    12311232                        result = 1;
    12321233                }
    12331234                break;
    12341235        case 0x40: // load
    1235                 if (loadState(slot, _saveTemporaryState))
     1236                if (loadState(slot, false))
    12361237                        result = 3; // sucess
    12371238                else
    12381239                        result = 5; // failed to load
    12391240                break;
    12401241        case 0x80: // save
    1241                 //if (saveState(slot, _saveTemporaryState))
    1242                 //      result = 0; // sucess
    1243                 //else
     1242                if (_game.version <= 3) {
     1243                        char name[32];
     1244                        if (_game.version <= 2) {
     1245                                // use generic name
     1246                                sprintf(name, "Game %c", 'A'+slot-1);
     1247                        } else {
     1248                                // use name entered by the user
     1249                                char* ptr;
     1250                                int firstSlot = (_game.id == GID_LOOM) ? RESID_SAVENAME1_LOOM : RESID_SAVENAME1;
     1251                                ptr = (char*)getStringAddress(slot + firstSlot - 1);
     1252                                strncpy(name, ptr, sizeof(name));
     1253                        }
     1254
     1255                        if(savePreparedSavegame(slot, name))
     1256                                result = 0;
     1257                        else
     1258                                result = 2;
     1259                } else {
    12441260                        result = 2; // failed to save
     1261                }
    12451262                break;
    12461263        case 0xC0: // test if save exists
    12471264                Common::InSaveFile *file;