aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/preagi_winnie.cpp
diff options
context:
space:
mode:
authorFilippos Karapetis2007-12-08 18:25:00 +0000
committerFilippos Karapetis2007-12-08 18:25:00 +0000
commit3980bd73ea7a00de469ae64d90485dcd197689fa (patch)
treebd26f9d3b63b35d87a5ccf0538735cea17bec7c5 /engines/agi/preagi_winnie.cpp
parentf1a1254581498d87c4db1e8a185ca84e7dc63013 (diff)
downloadscummvm-rg350-3980bd73ea7a00de469ae64d90485dcd197689fa.tar.gz
scummvm-rg350-3980bd73ea7a00de469ae64d90485dcd197689fa.tar.bz2
scummvm-rg350-3980bd73ea7a00de469ae64d90485dcd197689fa.zip
Saving and loading in Winnie the Pooh should now be endian and alignment safe. Note that this breaks older saved games and it's no longer possible to use saved games from the original game interpreter
svn-id: r29771
Diffstat (limited to 'engines/agi/preagi_winnie.cpp')
-rw-r--r--engines/agi/preagi_winnie.cpp66
1 files changed, 54 insertions, 12 deletions
diff --git a/engines/agi/preagi_winnie.cpp b/engines/agi/preagi_winnie.cpp
index 893742b05c..82be15a0d0 100644
--- a/engines/agi/preagi_winnie.cpp
+++ b/engines/agi/preagi_winnie.cpp
@@ -31,12 +31,14 @@
#include "common/events.h"
#include "common/savefile.h"
+#include "common/stream.h"
namespace Agi {
// default attributes
-#define IDA_DEFAULT 0x0F
-#define IDA_DEFAULT_REV 0xF0
+#define IDA_DEFAULT 0x0F
+#define IDA_DEFAULT_REV 0xF0
+#define WTP_SAVEGAME_VERSION 1
void Winnie::parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len) {
bool isBigEndian = (_vm->getPlatform() == Common::kPlatformAmiga);
@@ -1192,33 +1194,73 @@ void Winnie::gameOver() {
}
void Winnie::saveGame() {
- uint8 *buffer = (uint8 *)malloc(sizeof(WTP_SAVE_GAME));
- memcpy(buffer, &_game, sizeof(WTP_SAVE_GAME));
Common::OutSaveFile* outfile;
char szFile[256] = {0};
+ int i = 0;
sprintf(szFile, IDS_WTP_FILE_SAVEGAME);
if (!(outfile = _vm->getSaveFileMan()->openForSaving(szFile)))
return;
- outfile->write(buffer, sizeof(WTP_SAVE_GAME));
- delete outfile;
- free(buffer);
+ outfile->writeUint32BE(MKID_BE('WINN')); // header
+ outfile->writeByte(WTP_SAVEGAME_VERSION);
+
+ outfile->writeByte(_game.fSound);
+ outfile->writeByte(_game.nMoves);
+ outfile->writeByte(_game.nObjMiss);
+ outfile->writeByte(_game.nObjRet);
+ outfile->writeByte(_game.iObjHave);
+
+ for(i = 0; i < IDI_WTP_MAX_FLAG; i++)
+ outfile->writeByte(_game.fGame[i]);
+
+ for(i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++)
+ outfile->writeByte(_game.iUsedObj[i]);
+
+ for(i = 0; i < IDI_WTP_MAX_ROOM_OBJ; i++)
+ outfile->writeByte(_game.iObjRoom[i]);
+
+ outfile->finalize();
+
+ if (outfile->ioFailed())
+ warning("Can't write file '%s'. (Disk full?)", szFile);
+
+ delete outfile;
}
void Winnie::loadGame() {
- uint8 *buffer = (uint8 *)malloc(sizeof(WTP_SAVE_GAME));
Common::InSaveFile* infile;
char szFile[256] = {0};
+ int saveVersion = 0;
+ int i = 0;
sprintf(szFile, IDS_WTP_FILE_SAVEGAME);
if (!(infile = _vm->getSaveFileMan()->openForLoading(szFile)))
return;
- infile->read(buffer, sizeof(WTP_SAVE_GAME));
- delete infile;
- memcpy(&_game, buffer, sizeof(WTP_SAVE_GAME));
- free(buffer);
+ if (infile->readUint32BE() != MKID_BE('WINN'))
+ error("Winnie::loadGame wrong save game format");
+
+ saveVersion = infile->readByte();
+ if (saveVersion != WTP_SAVEGAME_VERSION)
+ warning("Old save game version (%d, current version is %d). Will try and read anyway, but don't be surprised if bad things happen", saveVersion, WTP_SAVEGAME_VERSION);
+
+ _game.fSound = infile->readByte();
+ _game.nMoves = infile->readByte();
+ _game.nObjMiss = infile->readByte();
+ _game.nObjRet = infile->readByte();
+ _game.iObjHave = infile->readByte();
+
+ for(i = 0; i < IDI_WTP_MAX_FLAG; i++)
+ _game.fGame[i] = infile->readByte();
+
+ for(i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++)
+ _game.iUsedObj[i] = infile->readByte();
+
+ for(i = 0; i < IDI_WTP_MAX_ROOM_OBJ; i++)
+ _game.iObjRoom[i] = infile->readByte();
+
+ delete infile;
}
// Console-related functions