Ticket #8624: dialog_save.2.patch
File dialog_save.2.patch, 5.4 KB (added by , 18 years ago) |
---|
-
engines/scumm/input.cpp
499 499 500 500 // Alt-F5 brings up the original save/load dialog. 501 501 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 } 505 509 } 506 510 507 511 if (lastKeyHit == saveloadkey) { -
engines/scumm/scumm.h
330 330 331 331 enum ResIds { 332 332 RESID_IQ_EPISODE = 7, 333 RESID_IQ_SERIES = 9 333 RESID_IQ_SERIES = 9, 334 RESID_SAVENAME1 = 10, 335 RESID_SAVENAME1_LOOM = 9 334 336 }; 335 337 336 338 … … 624 626 void requestSave(int slot, const char *name, bool temporary = false); 625 627 void requestLoad(int slot); 626 628 629 void prepareSavegame(); 630 bool savePreparedSavegame(int slot, char *desc); 631 bool copyRenameSavegame(int oldSlot, bool oldTemporary, int newSlot, bool newTemporary, char *desc); 632 627 633 // thumbnail + info stuff 628 634 public: 629 635 Graphics::Surface *loadThumbnailFromSlot(int slot); -
engines/scumm/saveload.cpp
84 84 _saveLoadFlag = 2; // 2 for load 85 85 } 86 86 87 static 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 87 99 bool ScummEngine::saveState(int slot, bool compat) { 88 100 char filename[256]; 89 101 Common::OutSaveFile *out; … … 95 107 return false; 96 108 97 109 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); 107 111 saveThumbnail(out); 108 112 saveInfos(out); 109 113 … … 429 433 return true; 430 434 } 431 435 436 void ScummEngine::prepareSavegame() { 437 saveState(0, true); 438 } 439 440 bool ScummEngine::savePreparedSavegame(int slot, char *desc) { 441 return copyRenameSavegame(0, true, slot, false, desc); 442 } 443 444 bool 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 432 500 Graphics::Surface *ScummEngine::loadThumbnailFromSlot(int slot) { 433 501 char filename[256]; 434 502 Common::InSaveFile *in; -
engines/scumm/script_v5.cpp
1222 1222 result = 100; 1223 1223 break; 1224 1224 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; 1229 1230 } else { 1230 1231 // set current drive 1231 1232 result = 1; 1232 1233 } 1233 1234 break; 1234 1235 case 0x40: // load 1235 if (loadState(slot, _saveTemporaryState))1236 if (loadState(slot, false)) 1236 1237 result = 3; // sucess 1237 1238 else 1238 1239 result = 5; // failed to load 1239 1240 break; 1240 1241 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 { 1244 1260 result = 2; // failed to save 1261 } 1245 1262 break; 1246 1263 case 0xC0: // test if save exists 1247 1264 Common::InSaveFile *file;