aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruruk2013-08-20 21:26:23 +0200
committeruruk2013-08-20 21:26:23 +0200
commitf8796e720eea8122bf7ecef7f1dcd75c39b75a97 (patch)
tree639c0e3ac4ce4e4bd162adae241ce6a7ec0eca98
parentaab393077942224a5f376846582f7cd987366f75 (diff)
downloadscummvm-rg350-f8796e720eea8122bf7ecef7f1dcd75c39b75a97.tar.gz
scummvm-rg350-f8796e720eea8122bf7ecef7f1dcd75c39b75a97.tar.bz2
scummvm-rg350-f8796e720eea8122bf7ecef7f1dcd75c39b75a97.zip
AVALANCHE: Add thumbnail support and version tracking to the saving/loading system. Repair Trip::trippancy_link().
-rw-r--r--engines/avalanche/avalanche.cpp24
-rw-r--r--engines/avalanche/detection.cpp73
-rw-r--r--engines/avalanche/trip6.cpp2
3 files changed, 84 insertions, 15 deletions
diff --git a/engines/avalanche/avalanche.cpp b/engines/avalanche/avalanche.cpp
index e714f0b5f6..8c893176e8 100644
--- a/engines/avalanche/avalanche.cpp
+++ b/engines/avalanche/avalanche.cpp
@@ -39,6 +39,7 @@
#include "engines/util.h"
#include "gui/saveload.h"
+#include "graphics/thumbnail.h"
namespace Avalanche {
@@ -361,19 +362,20 @@ Common::Error AvalancheEngine::saveGameState(int slot, const Common::String &des
bool AvalancheEngine::saveGame(const int16 slot, const Common::String &desc) {
Common::String fileName = getSaveFileName(slot);
Common::OutSaveFile *f = g_system->getSavefileManager()->openForSaving(fileName);
-
if (!f) {
warning("Can't create file '%s', game not saved.", fileName.c_str());
return false;
}
char *signature = "AVAL";
-
f->write(signature, 4);
- f->writeUint32LE(desc.size());
+ // Write version. We can't restore from obsolete versions.
+ f->writeByte(kSavegameVersion);
+ f->writeUint32LE(desc.size());
f->write(desc.c_str(), desc.size());
+ ::Graphics::saveThumbnail(*f);
TimeDate t;
_system->getTimeAndDate(t);
@@ -413,10 +415,9 @@ Common::Error AvalancheEngine::loadGameState(int slot) {
bool AvalancheEngine::loadGame(const int16 slot) {
Common::String fileName = getSaveFileName(slot);
Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName);
-
if (!f)
return false;
-
+
// Check for our signature.
Common::String signature;
for (byte i = 0; i < 4; i++)
@@ -424,6 +425,14 @@ bool AvalancheEngine::loadGame(const int16 slot) {
if (signature != "AVAL")
return false;
+ // Check version. We can't restore from obsolete versions.
+ byte saveVersion = f->readByte();
+ if (saveVersion != kSavegameVersion) {
+ warning("Savegame of incompatible version!");
+ delete f;
+ return false;
+ }
+
// Read the description.
uint32 descSize = f->readUint32LE();
Common::String description;
@@ -433,6 +442,9 @@ bool AvalancheEngine::loadGame(const int16 slot) {
}
description.toUppercase();
+ ::Graphics::skipThumbnail(*f);
+
+ // Read the time the game was saved.
TimeDate t;
t.tm_mday = f->readSint16LE();
t.tm_mon = f->readSint16LE();
@@ -478,7 +490,7 @@ bool AvalancheEngine::loadGame(const int16 slot) {
+ "saved on " + expandDate(t.tm_mday, t.tm_mon, t.tm_year) + '.');
if (_trip->tr[0].quick && _trip->tr[0].visible)
- _trip->rwsp(0, _gyro->dna.rw);
+ _trip->rwsp(0, _gyro->dna.rw); // We push Avvy in the right direction is he was moving.
return true;
}
diff --git a/engines/avalanche/detection.cpp b/engines/avalanche/detection.cpp
index a81e9a3b5f..39c6f0836f 100644
--- a/engines/avalanche/detection.cpp
+++ b/engines/avalanche/detection.cpp
@@ -87,6 +87,7 @@ public:
int getMaximumSaveSlot() const { return 99; }
SaveStateList listSaves(const char *target) const;
void removeSaveState(const char *target, int slot) const;
+ SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
};
bool AvalancheMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const {
@@ -96,7 +97,12 @@ bool AvalancheMetaEngine::createInstance(OSystem *syst, Engine **engine, const A
}
bool AvalancheMetaEngine::hasFeature(MetaEngineFeature f) const {
- return (f == kSupportsListSaves) || (f == kSupportsDeleteSave) || (f == kSupportsLoadingDuringStartup);
+ return
+ (f == kSupportsListSaves) ||
+ (f == kSupportsDeleteSave) ||
+ (f == kSupportsLoadingDuringStartup) ||
+ (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportThumbnail);
}
SaveStateList AvalancheMetaEngine::listSaves(const char *target) const {
@@ -121,16 +127,25 @@ SaveStateList AvalancheMetaEngine::listSaves(const char *target) const {
if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) {
Common::InSaveFile *file = saveFileMan->openForLoading(*filename);
if (file) {
- /*int saveVersion = file->readByte();
+ // Check for our signature.
+ Common::String signature;
+ for (byte i = 0; i < 4; i++)
+ signature += file->readByte();
+ if (signature != "AVAL") {
+ warning("Savegame of incompatible type!");
+ delete file;
+ continue;
+ }
+ // Check version.
+ byte saveVersion = file->readByte();
if (saveVersion != kSavegameVersion) {
- warning("Savegame of incompatible version");
- delete file;
- continue;
- }*/
+ warning("Savegame of incompatible version!");
+ delete file;
+ continue;
+ }
- // Read name
- file->seek(4); // We skip the "AVAL" signature.
+ // Read name.
uint32 nameSize = file->readUint32LE();
if (nameSize >= 255) {
delete file;
@@ -155,6 +170,48 @@ void AvalancheMetaEngine::removeSaveState(const char *target, int slot) const {
g_system->getSavefileManager()->removeSavefile(fileName);
}
+SaveStateDescriptor AvalancheMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+ Common::String fileName = Common::String::format("%s-%02d.SAV", target, slot);
+ Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName);
+
+ if (f) {
+ // Check for our signature.
+ Common::String signature;
+ for (byte i = 0; i < 4; i++)
+ signature += f->readByte();
+ if (signature != "AVAL") {
+ warning("Savegame of incompatible type!");
+ delete f;
+ return SaveStateDescriptor();
+ }
+
+ // Check version.
+ byte saveVersion = f->readByte();
+ if (saveVersion != kSavegameVersion) {
+ warning("Savegame of incompatible version!");
+ delete f;
+ return SaveStateDescriptor();
+ }
+
+ // Read the description.
+ uint32 descSize = f->readUint32LE();
+ Common::String description;
+ for (uint32 i = 0; i < descSize; i++) {
+ char actChar = f->readByte();
+ description += actChar;
+ }
+
+ SaveStateDescriptor desc(slot, description);
+
+ ::Graphics::Surface *const thumbnail = ::Graphics::loadThumbnail(*f);
+ desc.setThumbnail(thumbnail);
+
+ delete f;
+ return desc;
+ }
+ return SaveStateDescriptor();
+}
+
} // End of namespace Avalanche
#if PLUGIN_ENABLED_DYNAMIC(AVALANCHE)
diff --git a/engines/avalanche/trip6.cpp b/engines/avalanche/trip6.cpp
index 54312ce773..0009477738 100644
--- a/engines/avalanche/trip6.cpp
+++ b/engines/avalanche/trip6.cpp
@@ -1415,7 +1415,7 @@ void Trip::trippancy_link() {
if (_vm->_gyro->ddmnow | _vm->_gyro->ontoolbar | _vm->_gyro->seescroll)
return;
for (fv = 0; fv < numtr; fv++) {
- if (tr[fv].quick)
+ if (tr[fv].quick && tr[fv].visible)
tr[fv].walk();
}