diff options
author | Norbert Lange | 2009-08-24 17:51:47 +0000 |
---|---|---|
committer | Norbert Lange | 2009-08-24 17:51:47 +0000 |
commit | 917d4b78b36d6c5a5c25a03e7ee6a1c1b6a85fd5 (patch) | |
tree | e652563203a00f8acecfaafbf93c64dbfbd13f25 /engines/gob | |
parent | 5f87d5090cfcb34cda3c1f5d430e0865344d7366 (diff) | |
parent | dd7868acc2512c9761d892e67a4837f4dc38bdc0 (diff) | |
download | scummvm-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.cpp | 1 | ||||
-rw-r--r-- | engines/gob/inter.h | 2 | ||||
-rw-r--r-- | engines/gob/inter_playtoons.cpp | 118 | ||||
-rw-r--r-- | engines/gob/save/savehandler.cpp | 12 | ||||
-rw-r--r-- | engines/gob/save/savehandler.h | 2 | ||||
-rw-r--r-- | engines/gob/save/saveload.h | 43 | ||||
-rw-r--r-- | engines/gob/save/saveload_playtoons.cpp | 82 | ||||
-rw-r--r-- | engines/gob/save/saveload_v2.cpp | 14 | ||||
-rw-r--r-- | engines/gob/save/saveload_v3.cpp | 35 | ||||
-rw-r--r-- | engines/gob/save/saveload_v4.cpp | 28 | ||||
-rw-r--r-- | engines/gob/save/saveload_v6.cpp | 28 | ||||
-rw-r--r-- | engines/gob/sound/cdrom.cpp | 1 | ||||
-rw-r--r-- | engines/gob/video_v2.cpp | 49 | ||||
-rw-r--r-- | engines/gob/video_v6.cpp | 19 |
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 ¶ms); bool oPlaytoons_checkData(OpFuncParams ¶ms); + bool oPlaytoons_readData(OpFuncParams ¶ms); 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 ¶ms) { + 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 ¶ms) { int16 handle; int16 varOff; @@ -101,18 +124,16 @@ bool Inter_Playtoons::oPlaytoons_checkData(OpFuncParams ¶ms) { // 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 ¶ms) { return false; } +bool Inter_Playtoons::oPlaytoons_readData(OpFuncParams ¶ms) { + 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; } |