aboutsummaryrefslogtreecommitdiff
path: root/engines/gob
diff options
context:
space:
mode:
authorNorbert Lange2009-08-24 17:51:47 +0000
committerNorbert Lange2009-08-24 17:51:47 +0000
commit917d4b78b36d6c5a5c25a03e7ee6a1c1b6a85fd5 (patch)
treee652563203a00f8acecfaafbf93c64dbfbd13f25 /engines/gob
parent5f87d5090cfcb34cda3c1f5d430e0865344d7366 (diff)
parentdd7868acc2512c9761d892e67a4837f4dc38bdc0 (diff)
downloadscummvm-rg350-917d4b78b36d6c5a5c25a03e7ee6a1c1b6a85fd5.tar.gz
scummvm-rg350-917d4b78b36d6c5a5c25a03e7ee6a1c1b6a85fd5.tar.bz2
scummvm-rg350-917d4b78b36d6c5a5c25a03e7ee6a1c1b6a85fd5.zip
Merge with trunk
svn-id: r43701
Diffstat (limited to 'engines/gob')
-rw-r--r--engines/gob/demos/demoplayer.cpp1
-rw-r--r--engines/gob/inter.h2
-rw-r--r--engines/gob/inter_playtoons.cpp118
-rw-r--r--engines/gob/save/savehandler.cpp12
-rw-r--r--engines/gob/save/savehandler.h2
-rw-r--r--engines/gob/save/saveload.h43
-rw-r--r--engines/gob/save/saveload_playtoons.cpp82
-rw-r--r--engines/gob/save/saveload_v2.cpp14
-rw-r--r--engines/gob/save/saveload_v3.cpp35
-rw-r--r--engines/gob/save/saveload_v4.cpp28
-rw-r--r--engines/gob/save/saveload_v6.cpp28
-rw-r--r--engines/gob/sound/cdrom.cpp1
-rw-r--r--engines/gob/video_v2.cpp49
-rw-r--r--engines/gob/video_v6.cpp19
14 files changed, 310 insertions, 124 deletions
diff --git a/engines/gob/demos/demoplayer.cpp b/engines/gob/demos/demoplayer.cpp
index 13b7aa5327..bb56633525 100644
--- a/engines/gob/demos/demoplayer.cpp
+++ b/engines/gob/demos/demoplayer.cpp
@@ -56,6 +56,7 @@ DemoPlayer::Script DemoPlayer::_scripts[] = {
};
DemoPlayer::DemoPlayer(GobEngine *vm) : _vm(vm) {
+ _autoDouble = false;
_doubleMode = false;
_rebase0 = false;
}
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 057f52b360..43a4941402 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -557,7 +557,9 @@ protected:
virtual void setupOpcodesFunc();
virtual void setupOpcodesGob();
+ bool oPlaytoons_F_1B(OpFuncParams &params);
bool oPlaytoons_checkData(OpFuncParams &params);
+ bool oPlaytoons_readData(OpFuncParams &params);
void oPlaytoons_CD_20_23();
void oPlaytoons_CD_25();
void oPlaytoons_openItk();
diff --git a/engines/gob/inter_playtoons.cpp b/engines/gob/inter_playtoons.cpp
index e224f29734..d7cb6b79c2 100644
--- a/engines/gob/inter_playtoons.cpp
+++ b/engines/gob/inter_playtoons.cpp
@@ -25,6 +25,8 @@
#include "common/endian.h"
+#include "gui/message.h"
+
#include "gob/gob.h"
#include "gob/inter.h"
#include "gob/helper.h"
@@ -77,12 +79,33 @@ void Inter_Playtoons::setupOpcodesDraw() {
void Inter_Playtoons::setupOpcodesFunc() {
Inter_v6::setupOpcodesFunc();
+ OPCODEFUNC(0x1B, oPlaytoons_F_1B);
OPCODEFUNC(0x3F, oPlaytoons_checkData);
+ OPCODEFUNC(0x4D, oPlaytoons_readData);
}
void Inter_Playtoons::setupOpcodesGob() {
}
+bool Inter_Playtoons::oPlaytoons_F_1B(OpFuncParams &params) {
+ int16 var1;
+ int16 var2;
+ int16 var3;
+ int16 var4;
+
+ var1 = _vm->_game->_script->readValExpr();
+ var2 = _vm->_game->_script->readValExpr();
+
+ _vm->_game->_script->evalExpr(0);
+
+ var3 = _vm->_game->_script->readValExpr();
+ var4 = _vm->_game->_script->readValExpr();
+
+ warning("oPlaytoons_F_1B not handled");
+
+ return false;
+}
+
bool Inter_Playtoons::oPlaytoons_checkData(OpFuncParams &params) {
int16 handle;
int16 varOff;
@@ -101,18 +124,16 @@ bool Inter_Playtoons::oPlaytoons_checkData(OpFuncParams &params) {
// In this case, "@:\" is replaced by the CD drive letter.
// As the files are copied on the HDD, those characters are skipped.
if (strncmp(file, "@:\\", 3) == 0) {
- debugC(2, kDebugFileIO, "File check: \"%s\" instead of \"%s\"", file + 3, file);
+ debugC(2, kDebugFileIO, "oPlaytoons_checkData: \"%s\" instead of \"%s\"", file + 3, file);
file += 3;
}
mode = _vm->_saveLoad->getSaveMode(file);
if (mode == SaveLoad::kSaveModeNone) {
-
if (_vm->_dataIO->existData(file))
size = _vm->_dataIO->getDataSize(file);
else
warning("File \"%s\" not found", file);
-
} else if (mode == SaveLoad::kSaveModeSave)
size = _vm->_saveLoad->getSize(file);
else if (mode == SaveLoad::kSaveModeExists)
@@ -130,6 +151,97 @@ bool Inter_Playtoons::oPlaytoons_checkData(OpFuncParams &params) {
return false;
}
+bool Inter_Playtoons::oPlaytoons_readData(OpFuncParams &params) {
+ int32 retSize;
+ int32 size;
+ int32 offset;
+ int16 dataVar;
+ int16 handle;
+ byte *buf;
+ SaveLoad::SaveMode mode;
+
+ _vm->_game->_script->evalExpr(0);
+ dataVar = _vm->_game->_script->readVarIndex();
+ size = _vm->_game->_script->readValExpr();
+ _vm->_game->_script->evalExpr(0);
+ offset = _vm->_game->_script->getResultInt();
+ retSize = 0;
+
+ char *file = _vm->_game->_script->getResultStr();
+
+ // WORKAROUND: In Playtoons games, some files are read on CD (and only on CD).
+ // In this case, "@:\" is replaced by the CD drive letter.
+ // As the files are copied on the HDD, those characters are skipped.
+ if (strncmp(file, "@:\\", 3) == 0) {
+ debugC(2, kDebugFileIO, "oPlaytoons_readData: \"%s\" instead of \"%s\"", file + 3, file);
+ file += 3;
+ }
+
+ debugC(2, kDebugFileIO, "Read from file \"%s\" (%d, %d bytes at %d)",
+ file, dataVar, size, offset);
+
+ mode = _vm->_saveLoad->getSaveMode(file);
+ if (mode == SaveLoad::kSaveModeSave) {
+
+ WRITE_VAR(1, 1);
+
+ if (!_vm->_saveLoad->load(file, dataVar, size, offset)) {
+ GUI::MessageDialog dialog("Failed to load game state from file.");
+ dialog.runModal();
+ } else
+ WRITE_VAR(1, 0);
+
+ return false;
+
+ } else if (mode == SaveLoad::kSaveModeIgnore)
+ return false;
+
+ if (size < 0) {
+ warning("Attempted to read a raw sprite from file \"%s\"",
+ file);
+ return false ;
+ } else if (size == 0) {
+ dataVar = 0;
+ size = _vm->_game->_script->getVariablesCount() * 4;
+ }
+
+ buf = _variables->getAddressOff8(dataVar);
+
+ if (file[0] == 0) {
+ WRITE_VAR(1, size);
+ return false;
+ }
+
+ WRITE_VAR(1, 1);
+ handle = _vm->_dataIO->openData(file);
+
+ if (handle < 0)
+ return false;
+
+ DataStream *stream = _vm->_dataIO->openAsStream(handle, true);
+
+ _vm->_draw->animateCursor(4);
+ if (offset < 0)
+ stream->seek(offset + 1, SEEK_END);
+ else
+ stream->seek(offset);
+
+ if (((dataVar >> 2) == 59) && (size == 4)) {
+ WRITE_VAR(59, stream->readUint32LE());
+ // The scripts in some versions divide through 256^3 then,
+ // effectively doing a LE->BE conversion
+ if ((_vm->getPlatform() != Common::kPlatformPC) && (VAR(59) < 256))
+ WRITE_VAR(59, SWAP_BYTES_32(VAR(59)));
+ } else
+ retSize = stream->read(buf, size);
+
+ if (retSize == size)
+ WRITE_VAR(1, 0);
+
+ delete stream;
+ return false;
+}
+
void Inter_Playtoons::oPlaytoons_CD_20_23() {
_vm->_game->_script->evalExpr(0);
}
diff --git a/engines/gob/save/savehandler.cpp b/engines/gob/save/savehandler.cpp
index 4e2c09bdca..5f24115a6c 100644
--- a/engines/gob/save/savehandler.cpp
+++ b/engines/gob/save/savehandler.cpp
@@ -229,6 +229,9 @@ int32 TempSpriteHandler::getSize() {
}
bool TempSpriteHandler::load(int16 dataVar, int32 size, int32 offset) {
+ if (isDummy(size))
+ return true;
+
// Sprite available?
if (!_sprite)
return false;
@@ -274,6 +277,9 @@ bool TempSpriteHandler::load(int16 dataVar, int32 size, int32 offset) {
bool TempSpriteHandler::save(int16 dataVar, int32 size, int32 offset) {
SurfaceDescPtr sprite;
+ if (isDummy(size))
+ return true;
+
if (!createSprite(dataVar, size, offset, &sprite))
return false;
@@ -320,6 +326,12 @@ bool TempSpriteHandler::createSprite(int16 dataVar, int32 size,
return true;
}
+// A size of 0 means no proper sprite should be saved/loaded,
+// but no error should be thrown either.
+bool TempSpriteHandler::isDummy(int32 size) {
+ return (size == 0);
+}
+
// A negative size is the flag for using a sprite
bool TempSpriteHandler::isSprite(int32 size) {
return (size < 0);
diff --git a/engines/gob/save/savehandler.h b/engines/gob/save/savehandler.h
index 55505d1b9a..6a7e563a8f 100644
--- a/engines/gob/save/savehandler.h
+++ b/engines/gob/save/savehandler.h
@@ -144,6 +144,8 @@ public:
protected:
SavePartSprite *_sprite;
+ /** Determine whether it's a dummy sprite save/load. */
+ static bool isDummy(int32 size);
/** Determine whether using a sprite was requested. */
static bool isSprite(int32 size);
/** Determine which sprite is meant. */
diff --git a/engines/gob/save/saveload.h b/engines/gob/save/saveload.h
index 4779de703c..8e1240daf1 100644
--- a/engines/gob/save/saveload.h
+++ b/engines/gob/save/saveload.h
@@ -77,6 +77,9 @@ public:
static const uint32 kSlotCount = 15;
static const uint32 kSlotNameLength = 40;
+ /** The index. kSlotCount * kSlotNameLength bytes. */
+ static const uint32 kIndexSize = kSlotCount * kSlotNameLength;
+
SaveLoad_v2(GobEngine *vm, const char *targetName);
virtual ~SaveLoad_v2();
@@ -111,8 +114,7 @@ protected:
int getSlotRemainder(int32 offset) const;
};
- /** The index. kSlotCount * kSlotNameLength bytes. */
- byte _index[600];
+ byte _index[kIndexSize];
bool _hasIndex;
File *_slotFile;
@@ -139,6 +141,10 @@ public:
static const uint32 kSlotCount = 30;
static const uint32 kSlotNameLength = 40;
+ static const uint32 kPropsSize = 500;
+ /** Index. kSlotCount * kSlotNameLength bytes. */
+ static const uint32 kIndexSize = kSlotCount * kSlotNameLength;
+
enum ScreenshotType {
kScreenshotTypeGob3, //!< Goblins 3 type screenshot
kScreenshotTypeLost //!< Lost in Time type screenshot
@@ -193,9 +199,8 @@ protected:
bool _firstSize;
/** Global properties. */
- byte _props[500];
- /** Index. kSlotCount * kSlotNameLength bytes. */
- byte _index[1200];
+ byte _props[kPropsSize];
+ byte _index[kIndexSize];
bool _hasIndex;
SaveReader *_reader;
@@ -251,6 +256,7 @@ protected:
GameHandler *_gameHandler;
NotesHandler *_notesHandler;
+ TempSpriteHandler *_tempSpriteHandler;
ScreenshotHandler *_screenshotHandler;
SaveHandler *getHandler(const char *fileName) const;
@@ -266,6 +272,10 @@ public:
static const uint32 kSlotCount = 10;
static const uint32 kSlotNameLength = 40;
+ static const uint32 kPropsSize = 500;
+ /** Index. kSlotCount * kSlotNameLength bytes + 800 bytes 0. */
+ static const uint32 kIndexSize = (kSlotCount * kSlotNameLength) + 800;
+
SaveLoad_v4(GobEngine *vm, const char *targetName);
virtual ~SaveLoad_v4();
@@ -311,9 +321,8 @@ protected:
private:
bool _firstSize;
- byte _props[500];
- /** The index. kSlotCount * kSlotNameLength bytes + 800 bytes 0. */
- byte _index[1200];
+ byte _props[kPropsSize];
+ byte _index[kIndexSize];
bool _hasIndex;
File *_slotFile;
@@ -392,6 +401,10 @@ public:
static const uint32 kSlotCount = 60;
static const uint32 kSlotNameLength = 40;
+ static const uint32 kPropsSize = 500;
+ /** Index. kSlotCount * kSlotNameLength bytes. */
+ static const uint32 kIndexSize = kSlotCount * kSlotNameLength;
+
SaveLoad_v6(GobEngine *vm, const char *targetName);
virtual ~SaveLoad_v6();
@@ -426,9 +439,8 @@ protected:
int getSlotRemainder(int32 offset) const;
};
- byte _props[500];
- /** The index. 500 bytes properties + kSlotCount * kSlotNameLength bytes. */
- byte _index[2400];
+ byte _props[kPropsSize];
+ byte _index[kIndexSize];
File *_slotFile;
@@ -454,6 +466,10 @@ public:
static const uint32 kSlotCount = 60;
static const uint32 kSlotNameLength = 40;
+ static const uint32 kPropsSize = 1642;
+ /** Index. kSlotCount * kSlotNameLength bytes. */
+ static const uint32 kIndexSize = kSlotCount * kSlotNameLength;
+
SaveLoad_Playtoons(GobEngine *vm, const char *targetName);
virtual ~SaveLoad_Playtoons();
@@ -488,9 +504,8 @@ protected:
int getSlotRemainder(int32 offset) const;
};
- byte _props[500];
- /** The index. 500 bytes properties + kSlotCount * kSlotNameLength bytes. */
- byte _index[2400];
+ byte _props[kPropsSize];
+ byte _index[kIndexSize];
File *_slotFile;
diff --git a/engines/gob/save/saveload_playtoons.cpp b/engines/gob/save/saveload_playtoons.cpp
index 392c9a94ac..48adcdc59e 100644
--- a/engines/gob/save/saveload_playtoons.cpp
+++ b/engines/gob/save/saveload_playtoons.cpp
@@ -30,27 +30,39 @@
namespace Gob {
SaveLoad_Playtoons::SaveFile SaveLoad_Playtoons::_saveFiles[] = {
- { "did.inf", kSaveModeSave, 0, 0}, //
- { "dan.itk", kSaveModeNone, 0, 0}, // Playtoons CK initial detection file
- { "disk.001", kSaveModeExists, 0, 0}, // Playtoons 1 identification file
- { "disk.002", kSaveModeExists, 0, 0}, // Playtoons 2 identification file
- { "disk.003", kSaveModeExists, 0, 0}, // Playtoons 3 identification file
- { "disk.004", kSaveModeExists, 0, 0}, // Playtoons 4 identification file
- { "disk.005", kSaveModeExists, 0, 0}, // Playtoons 5 identification file
- { "disk.006", kSaveModeExists, 0, 0}, // Playtoons CK 1 identification file
- { "disk.007", kSaveModeExists, 0, 0}, // Playtoons CK 2 identification file
- { "disk.008", kSaveModeExists, 0, 0}, // Playtoons CK 3 identification file
-/*
- { "titre.001", kSaveModeExists, 0, 0}, // Playtoons 1 titles
- { "titre.002", kSaveModeExists, 0, 0}, // Playtoons 2 titles
- { "titre.003", kSaveModeExists, 0, 0}, // Playtoons 3 titles
- { "titre.004", kSaveModeExists, 0, 0}, // Playtoons 4 titles
- { "titre.005", kSaveModeExists, 0, 0}, // Playtoons 5 titles
- { "titre.006", kSaveModeExists, 0, 0}, // Playtoons CK 1 empty title (???)
- { "titre.007", kSaveModeExists, 0, 0}, // Playtoons CK 2 empty title (???)
- { "titre.008", kSaveModeExists, 0, 0}, // Playtoons CK 3 empty title (???)
- { "mdo.def", kSaveModeExists, 0, 0}, //
-*/
+ { "did.inf", kSaveModeSave, 0, 0}, // Purpose ignored at the moment, intensively used to save things.
+ { "dan.itk", kSaveModeNone, 0, 0}, // Playtoons CK detection file
+ { "titre.009", kSaveModeIgnore, 0, 0}, // Playtoons theoritical title files that are checked for nothing
+ { "titre.010", kSaveModeIgnore, 0, 0},
+ { "titre.011", kSaveModeIgnore, 0, 0},
+ { "titre.012", kSaveModeIgnore, 0, 0},
+ { "titre.013", kSaveModeIgnore, 0, 0},
+ { "titre.014", kSaveModeIgnore, 0, 0},
+ { "titre.015", kSaveModeIgnore, 0, 0},
+ { "titre.016", kSaveModeIgnore, 0, 0},
+ { "titre.017", kSaveModeIgnore, 0, 0},
+ { "titre.018", kSaveModeIgnore, 0, 0},
+ { "titre.019", kSaveModeIgnore, 0, 0},
+ { "titre.020", kSaveModeIgnore, 0, 0},
+ { "titre.021", kSaveModeIgnore, 0, 0},
+ { "titre.022", kSaveModeIgnore, 0, 0},
+ { "titre.023", kSaveModeIgnore, 0, 0},
+ { "titre.024", kSaveModeIgnore, 0, 0},
+ { "titre.025", kSaveModeIgnore, 0, 0},
+ { "titre.026", kSaveModeIgnore, 0, 0},
+ { "titre.027", kSaveModeIgnore, 0, 0},
+ { "titre.028", kSaveModeIgnore, 0, 0},
+ { "titre.029", kSaveModeIgnore, 0, 0},
+ { "titre.030", kSaveModeIgnore, 0, 0},
+ { "titre.031", kSaveModeIgnore, 0, 0},
+ { "titre.032", kSaveModeIgnore, 0, 0},
+ { "titre.033", kSaveModeIgnore, 0, 0},
+ { "titre.034", kSaveModeIgnore, 0, 0},
+ { "titre.035", kSaveModeIgnore, 0, 0},
+ { "titre.036", kSaveModeIgnore, 0, 0},
+ { "titre.037", kSaveModeIgnore, 0, 0},
+ { "titre.038", kSaveModeIgnore, 0, 0},
+ { "titre.039", kSaveModeIgnore, 0, 0},
};
SaveLoad_Playtoons::GameHandler::File::File(GobEngine *vm, const char *base) :
@@ -66,7 +78,7 @@ int SaveLoad_Playtoons::GameHandler::File::getSlot(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 2900) / varSize);
+ return ((offset - (kPropsSize + kIndexSize)) / varSize);
}
int SaveLoad_Playtoons::GameHandler::File::getSlotRemainder(int32 offset) const {
@@ -75,13 +87,13 @@ int SaveLoad_Playtoons::GameHandler::File::getSlotRemainder(int32 offset) const
if (varSize == 0)
return -1;
- return ((offset - 2900) % varSize);
+ return ((offset - (kPropsSize + kIndexSize)) % varSize);
}
SaveLoad_Playtoons::GameHandler::GameHandler(GobEngine *vm, const char *target) : SaveHandler(vm) {
- memset(_props, 0, 500);
- memset(_index, 0, 2400);
+ memset(_props, 0, kPropsSize);
+ memset(_index, 0, kIndexSize);
_slotFile = new File(vm, target);
}
@@ -96,7 +108,7 @@ int32 SaveLoad_Playtoons::GameHandler::getSize() {
if (varSize == 0)
return -1;
- return _slotFile->tallyUpFiles(varSize, 2900);
+ return _slotFile->tallyUpFiles(varSize, kPropsSize + kIndexSize);
}
bool SaveLoad_Playtoons::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
@@ -111,20 +123,20 @@ bool SaveLoad_Playtoons::GameHandler::load(int16 dataVar, int32 size, int32 offs
size = varSize;
}
- if (offset < 500) {
+ if (((uint32) offset) < kPropsSize) {
// Properties
- if ((offset + size) > 500) {
+ if (((uint32) (offset + size)) > kPropsSize) {
warning("Wrong index size (%d, %d)", size, offset);
return false;
}
_vm->_inter->_variables->copyFrom(dataVar, _props + offset, size);
- } else if (offset < 2900) {
+ } else if (((uint32) offset) < kPropsSize + kIndexSize) {
// Save index
- if (size != 2400) {
+ if (((uint32) size) != kIndexSize) {
warning("Wrong index size (%d, %d)", size, offset);
return false;
}
@@ -198,26 +210,26 @@ bool SaveLoad_Playtoons::GameHandler::save(int16 dataVar, int32 size, int32 offs
size = varSize;
}
- if (offset < 500) {
+ if (((uint32) offset) < kPropsSize) {
// Properties
- if ((offset + size) > 500) {
+ if (((uint32) (offset + size)) > kPropsSize) {
warning("Wrong index size (%d, %d)", size, offset);
return false;
}
_vm->_inter->_variables->copyTo(dataVar, _props + offset, size);
- } else if (offset < 2900) {
+ } else if (((uint32) offset) < kPropsSize + kIndexSize) {
// Save index
- if (size != 2400) {
+ if (((uint32) size) != kIndexSize) {
warning("Wrong index size (%d, %d)", size, offset);
return false;
}
// Just copy the index into our buffer
- _vm->_inter->_variables->copyTo(dataVar, _index, 2400);
+ _vm->_inter->_variables->copyTo(dataVar, _index, kIndexSize);
} else {
// Save slot, whole variable block
diff --git a/engines/gob/save/saveload_v2.cpp b/engines/gob/save/saveload_v2.cpp
index da1135df21..ea639b861a 100644
--- a/engines/gob/save/saveload_v2.cpp
+++ b/engines/gob/save/saveload_v2.cpp
@@ -51,7 +51,7 @@ int SaveLoad_v2::GameHandler::File::getSlot(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 600) / varSize);
+ return ((offset - kIndexSize) / varSize);
}
int SaveLoad_v2::GameHandler::File::getSlotRemainder(int32 offset) const {
@@ -60,12 +60,12 @@ int SaveLoad_v2::GameHandler::File::getSlotRemainder(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 600) % varSize);
+ return ((offset - kIndexSize) % varSize);
}
SaveLoad_v2::GameHandler::GameHandler(GobEngine *vm, const char *target) : SaveHandler(vm) {
- memset(_index, 0, 600);
+ memset(_index, 0, kIndexSize);
_hasIndex = false;
_slotFile = new File(vm, target);
@@ -81,7 +81,7 @@ int32 SaveLoad_v2::GameHandler::getSize() {
if (varSize == 0)
return -1;
- return _slotFile->tallyUpFiles(varSize, 600);
+ return _slotFile->tallyUpFiles(varSize, kIndexSize);
}
bool SaveLoad_v2::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
@@ -99,7 +99,7 @@ bool SaveLoad_v2::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
if (offset == 0) {
// Save index
- if (size != 600) {
+ if (((uint32) size) != kIndexSize) {
warning("Requested index has wrong size (%d)", size);
return false;
}
@@ -184,13 +184,13 @@ bool SaveLoad_v2::GameHandler::save(int16 dataVar, int32 size, int32 offset) {
if (offset == 0) {
// Save index
- if (size != 600) {
+ if (((uint32) size) != kIndexSize) {
warning("Requested index has wrong size (%d)", size);
return false;
}
// Just copy the index into our buffer
- _vm->_inter->_variables->copyTo(dataVar, _index, 600);
+ _vm->_inter->_variables->copyTo(dataVar, _index, kIndexSize);
_hasIndex = true;
} else {
diff --git a/engines/gob/save/saveload_v3.cpp b/engines/gob/save/saveload_v3.cpp
index c24b13d27b..bb60f94725 100644
--- a/engines/gob/save/saveload_v3.cpp
+++ b/engines/gob/save/saveload_v3.cpp
@@ -33,8 +33,8 @@ namespace Gob {
SaveLoad_v3::SaveFile SaveLoad_v3::_saveFiles[] = {
{ "cat.inf", kSaveModeSave , 0, "savegame"},
{ "ima.inf", kSaveModeSave , 0, "screenshot"},
+ { "intro.$$$", kSaveModeSave , 0, "temporary sprite"},
{ "bloc.inf", kSaveModeSave , 0, "notes"},
- { "intro.$$$", kSaveModeIgnore, 0, "temporary sprite"},
{ "prot", kSaveModeIgnore, 0, 0},
{ "config", kSaveModeIgnore, 0, 0}
};
@@ -57,7 +57,7 @@ int SaveLoad_v3::GameHandler::File::getSlot(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 1700) / varSize);
+ return ((offset - (kPropsSize + kIndexSize)) / varSize);
}
int SaveLoad_v3::GameHandler::File::getSlotRemainder(int32 offset) const {
@@ -66,7 +66,7 @@ int SaveLoad_v3::GameHandler::File::getSlotRemainder(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 1700) % varSize);
+ return ((offset - (kPropsSize + kIndexSize)) % varSize);
}
@@ -78,8 +78,8 @@ SaveLoad_v3::GameHandler::GameHandler(GobEngine *vm, const char *target,
_usesScreenshots = usesScreenshots;
_firstSize = true;
- memset(_props, 0, 500);
- memset(_index, 0, 1200);
+ memset(_props, 0, kPropsSize);
+ memset(_index, 0, kIndexSize);
_hasIndex = false;
_writer = 0;
@@ -104,7 +104,7 @@ int32 SaveLoad_v3::GameHandler::getSize() {
if (varSize == 0)
return -1;
- return _slotFile->tallyUpFiles(varSize, 1700);
+ return _slotFile->tallyUpFiles(varSize, kPropsSize + kIndexSize);
}
bool SaveLoad_v3::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
@@ -119,22 +119,22 @@ bool SaveLoad_v3::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
size = varSize;
}
- if (offset < 500) {
+ if (((uint32) offset) < kPropsSize) {
// Global properties, like joker usage
debugC(3, kDebugSaveLoad, "Loading global properties");
- if ((size + offset) > 500) {
+ if (((uint32) (offset + size)) > kPropsSize) {
warning("Wrong global properties list size (%d, %d)", size, offset);
return false;
}
_vm->_inter->_variables->copyFrom(dataVar, _props + offset, size);
- } else if (offset == 500) {
+ } else if (((uint32) offset) == kPropsSize) {
// Save index
- if (size != 1200) {
+ if (((uint32) size) != kIndexSize) {
warning("Requested index has wrong size (%d)", size);
return false;
}
@@ -193,28 +193,28 @@ bool SaveLoad_v3::GameHandler::save(int16 dataVar, int32 size, int32 offset) {
size = varSize;
}
- if (offset < 500) {
+ if (((uint32) offset) < kPropsSize) {
// Global properties, like joker usage
debugC(3, kDebugSaveLoad, "Saving global properties");
- if ((size + offset) > 500) {
+ if (((uint32) (offset + size)) > kPropsSize) {
warning("Wrong global properties list size (%d, %d)", size, offset);
return false;
}
_vm->_inter->_variables->copyTo(dataVar, _props + offset, size);
- } else if (offset == 500) {
+ } else if (((uint32) offset) == kPropsSize) {
// Save index
- if (size != 1200) {
+ if (((uint32) size) != kIndexSize) {
warning("Requested index has wrong size (%d)", size);
return false;
}
// Just copy the index into our buffer
- _vm->_inter->_variables->copyTo(dataVar, _index, 1200);
+ _vm->_inter->_variables->copyTo(dataVar, _index, kIndexSize);
_hasIndex = true;
} else {
@@ -496,17 +496,20 @@ SaveLoad_v3::SaveLoad_v3(GobEngine *vm, const char *targetName, ScreenshotType s
_screenshotHandler = new ScreenshotHandler(vm, _gameHandler, sShotType);
}
+ _tempSpriteHandler = new TempSpriteHandler(vm);
_notesHandler = new NotesHandler(2560, vm, targetName);
_saveFiles[0].handler = _gameHandler;
_saveFiles[1].handler = _screenshotHandler;
- _saveFiles[2].handler = _notesHandler;
+ _saveFiles[2].handler = _tempSpriteHandler;
+ _saveFiles[3].handler = _notesHandler;
}
SaveLoad_v3::~SaveLoad_v3() {
delete _screenshotHandler;
delete _gameHandler;
delete _notesHandler;
+ delete _tempSpriteHandler;
}
const SaveLoad_v3::SaveFile *SaveLoad_v3::getSaveFile(const char *fileName) const {
diff --git a/engines/gob/save/saveload_v4.cpp b/engines/gob/save/saveload_v4.cpp
index 16c87b9a64..e6973efd64 100644
--- a/engines/gob/save/saveload_v4.cpp
+++ b/engines/gob/save/saveload_v4.cpp
@@ -63,7 +63,7 @@ int SaveLoad_v4::GameHandler::File::getSlot(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 1700) / varSize);
+ return ((offset - (kPropsSize + kIndexSize)) / varSize);
}
int SaveLoad_v4::GameHandler::File::getSlotRemainder(int32 offset) const {
@@ -72,14 +72,14 @@ int SaveLoad_v4::GameHandler::File::getSlotRemainder(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 1700) % varSize);
+ return ((offset - (kPropsSize + kIndexSize)) % varSize);
}
SaveLoad_v4::GameHandler::GameHandler(GobEngine *vm, const char *target) : SaveHandler(vm) {
_firstSize = true;
- memset(_props, 0, 500);
- memset(_index, 0, 1200);
+ memset(_props, 0, kPropsSize);
+ memset(_index, 0, kIndexSize);
_hasIndex = false;
_slotFile = new File(vm, target);
@@ -112,7 +112,7 @@ int32 SaveLoad_v4::GameHandler::getSize() {
if (varSize == 0)
return -1;
- return _slotFile->tallyUpFiles(varSize, 1700);
+ return _slotFile->tallyUpFiles(varSize, kPropsSize + kIndexSize);
}
bool SaveLoad_v4::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
@@ -127,22 +127,22 @@ bool SaveLoad_v4::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
size = varSize;
}
- if (offset < 500) {
+ if (((uint32) offset) < kPropsSize) {
// Global properties
debugC(3, kDebugSaveLoad, "Loading global properties");
- if ((size + offset) > 500) {
+ if (((uint32) (offset + size)) > kPropsSize) {
warning("Wrong global properties list size (%d, %d)", size, offset);
return false;
}
_vm->_inter->_variables->copyFrom(dataVar, _props + offset, size);
- } else if (offset == 500) {
+ } else if (((uint32) offset) == kPropsSize) {
// Save index
- if (size != 1200) {
+ if (((uint32) size) != kIndexSize) {
warning("Requested index has wrong size (%d)", size);
return false;
}
@@ -202,28 +202,28 @@ bool SaveLoad_v4::GameHandler::save(int16 dataVar, int32 size, int32 offset) {
size = varSize;
}
- if (offset < 500) {
+ if (((uint32) offset) < kPropsSize) {
// Global properties
debugC(3, kDebugSaveLoad, "Saving global properties");
- if ((size + offset) > 500) {
+ if (((uint32) (offset + size)) > kPropsSize) {
warning("Wrong global properties list size (%d, %d)", size, offset);
return false;
}
_vm->_inter->_variables->copyTo(dataVar, _props + offset, size);
- } else if (offset == 500) {
+ } else if (((uint32) offset) == kPropsSize) {
// Save index
- if (size != 1200) {
+ if (((uint32) size) != kIndexSize) {
warning("Requested index has wrong size (%d)", size);
return false;
}
// Just copy the index into our buffer
- _vm->_inter->_variables->copyTo(dataVar, _index, 1200);
+ _vm->_inter->_variables->copyTo(dataVar, _index, kIndexSize);
_hasIndex = true;
} else {
diff --git a/engines/gob/save/saveload_v6.cpp b/engines/gob/save/saveload_v6.cpp
index 45622bee73..e31c8b4809 100644
--- a/engines/gob/save/saveload_v6.cpp
+++ b/engines/gob/save/saveload_v6.cpp
@@ -50,7 +50,7 @@ int SaveLoad_v6::GameHandler::File::getSlot(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 2900) / varSize);
+ return ((offset - (kPropsSize + kIndexSize)) / varSize);
}
int SaveLoad_v6::GameHandler::File::getSlotRemainder(int32 offset) const {
@@ -59,13 +59,13 @@ int SaveLoad_v6::GameHandler::File::getSlotRemainder(int32 offset) const {
if (varSize == 0)
return -1;
- return ((offset - 2900) % varSize);
+ return ((offset - (kPropsSize + kIndexSize)) % varSize);
}
SaveLoad_v6::GameHandler::GameHandler(GobEngine *vm, const char *target) : SaveHandler(vm) {
- memset(_props, 0, 500);
- memset(_index, 0, 2400);
+ memset(_props, 0, kPropsSize);
+ memset(_index, 0, kIndexSize);
_slotFile = new File(vm, target);
}
@@ -80,7 +80,7 @@ int32 SaveLoad_v6::GameHandler::getSize() {
if (varSize == 0)
return -1;
- return _slotFile->tallyUpFiles(varSize, 2900);
+ return _slotFile->tallyUpFiles(varSize, kPropsSize + kIndexSize);
}
bool SaveLoad_v6::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
@@ -95,22 +95,22 @@ bool SaveLoad_v6::GameHandler::load(int16 dataVar, int32 size, int32 offset) {
size = varSize;
}
- if (offset < 500) {
+ if (((uint32) offset) < kPropsSize) {
// Properties
refreshProps();
- if ((offset + size) > 500) {
+ if (((uint32) (offset + size)) > kPropsSize) {
warning("Wrong index size (%d, %d)", size, offset);
return false;
}
_vm->_inter->_variables->copyFrom(dataVar, _props + offset, size);
- } else if (offset < 2900) {
+ } else if (((uint32) offset) < kPropsSize + kIndexSize) {
// Save index
- if (size != 2400) {
+ if (((uint32) size) != kIndexSize) {
warning("Wrong index size (%d, %d)", size, offset);
return false;
}
@@ -191,10 +191,10 @@ bool SaveLoad_v6::GameHandler::save(int16 dataVar, int32 size, int32 offset) {
size = varSize;
}
- if (offset < 500) {
+ if (((uint32) offset) < kPropsSize) {
// Properties
- if ((offset + size) > 500) {
+ if (((uint32) (offset + size)) > kPropsSize) {
warning("Wrong index size (%d, %d)", size, offset);
return false;
}
@@ -203,16 +203,16 @@ bool SaveLoad_v6::GameHandler::save(int16 dataVar, int32 size, int32 offset) {
refreshProps();
- } else if (offset < 2900) {
+ } else if (((uint32) offset) < kPropsSize + kIndexSize) {
// Save index
- if (size != 2400) {
+ if (((uint32) size) != kIndexSize) {
warning("Wrong index size (%d, %d)", size, offset);
return false;
}
// Just copy the index into our buffer
- _vm->_inter->_variables->copyTo(dataVar, _index, 2400);
+ _vm->_inter->_variables->copyTo(dataVar, _index, kIndexSize);
} else {
// Save slot, whole variable block
diff --git a/engines/gob/sound/cdrom.cpp b/engines/gob/sound/cdrom.cpp
index 4d6a7ec966..68cbb1b9e2 100644
--- a/engines/gob/sound/cdrom.cpp
+++ b/engines/gob/sound/cdrom.cpp
@@ -46,6 +46,7 @@ CDROM::CDROM() {
}
CDROM::~CDROM() {
+ stop();
}
void CDROM::readLIC(DataStream &stream) {
diff --git a/engines/gob/video_v2.cpp b/engines/gob/video_v2.cpp
index b526b63a37..98cf4a5d4f 100644
--- a/engines/gob/video_v2.cpp
+++ b/engines/gob/video_v2.cpp
@@ -64,12 +64,15 @@ char Video_v2::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight,
memBuffer = new byte[4370];
assert(memBuffer);
+ memset(memBuffer, 0, 4370);
+
srcPtr = sprBuf + 3;
+
sourceLeft = READ_LE_UINT32(srcPtr);
destPtr = destDesc.getVidMem() + destDesc.getWidth() * y + x;
- curWidth = 0;
+ curWidth = 0;
curHeight = 0;
linePtr = destPtr;
@@ -89,58 +92,64 @@ char Video_v2::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight,
cmdVar = 0;
while (1) {
cmdVar >>= 1;
- if ((cmdVar & 0x100) == 0) {
- cmdVar = *srcPtr | 0xFF00;
- srcPtr++;
- }
+ if ((cmdVar & 0x100) == 0)
+ cmdVar = *srcPtr++ | 0xFF00;
+
if ((cmdVar & 1) != 0) {
temp = *srcPtr++;
+
if ((temp != 0) || (transp == 0))
*destPtr = temp;
+
destPtr++;
curWidth++;
+
if (curWidth >= srcWidth) {
curWidth = 0;
linePtr += destDesc.getWidth();
destPtr = linePtr;
- curHeight++;
- if (curHeight >= srcHeight)
+ if (++curHeight >= srcHeight)
break;
}
- sourceLeft--;
+
memBuffer[bufPos] = temp;
- bufPos++;
- bufPos %= 4096;
- if (sourceLeft == 0)
+
+ bufPos = (bufPos + 1) % 4096;
+
+ if (--sourceLeft == 0)
break;
+
} else {
offset = *srcPtr++;
- offset |= (*srcPtr & 0xF0) << 4;
- strLen = (*srcPtr & 0x0F) + 3;
- *srcPtr++;
+ temp = *srcPtr++;
+
+ offset |= (temp & 0xF0) << 4;
+ strLen = (temp & 0x0F) + 3;
+
if (strLen == lenCmd)
strLen = *srcPtr++ + 18;
for (counter2 = 0; counter2 < strLen; counter2++) {
temp = memBuffer[(offset + counter2) % 4096];
+
if ((temp != 0) || (transp == 0))
*destPtr = temp;
- destPtr++;
+ destPtr++;
curWidth++;
+
if (curWidth >= srcWidth) {
curWidth = 0;
linePtr += destDesc.getWidth();
destPtr = linePtr;
- curHeight++;
- if (curHeight >= srcHeight) {
+ if (++curHeight >= srcHeight) {
delete[] memBuffer;
return 1;
}
}
+
memBuffer[bufPos] = temp;
- bufPos++;
- bufPos %= 4096;
+ bufPos = (bufPos + 1) % 4096;
}
if (strLen >= ((int32) sourceLeft)) {
@@ -148,7 +157,9 @@ char Video_v2::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight,
return 1;
} else
sourceLeft--;
+
}
+
}
} else
return 0;
diff --git a/engines/gob/video_v6.cpp b/engines/gob/video_v6.cpp
index c51b027bad..6f39edb588 100644
--- a/engines/gob/video_v6.cpp
+++ b/engines/gob/video_v6.cpp
@@ -84,8 +84,23 @@ char Video_v6::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight,
return 1;
}
- warning("Urban Stub: spriteUncompressor(), sprBuf[0,1] = %d,%d",
- sprBuf[0], sprBuf[1]);
+ if (srcWidth & 0xC000) {
+ warning("Playtoons Stub: srcWidth & 0xC000 == %04X", srcWidth & 0xC000);
+ srcWidth &= 0x3FFF;
+ }
+
+ if ((sprBuf[0] == 1) && (sprBuf[1] == 2)) {
+ if (Video_v2::spriteUncompressor(sprBuf, srcWidth, srcHeight, x, y, transp, destDesc))
+ return 1;
+
+ _vm->validateVideoMode(destDesc._vidMode);
+
+ _videoDriver->drawPackedSprite(sprBuf, srcWidth, srcHeight, x, y, transp, destDesc);
+ return 1;
+ }
+
+ warning("Urban Stub: spriteUncompressor(), sprBuf[0,1,2] = %d,%d,%d",
+ sprBuf[0], sprBuf[1], sprBuf[2]);
return 1;
}