diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/gob/dataio.cpp | 6 | ||||
-rw-r--r-- | engines/gob/save/savehandler.cpp | 4 | ||||
-rw-r--r-- | engines/mohawk/cursors.cpp | 69 | ||||
-rw-r--r-- | engines/mohawk/cursors.h | 4 | ||||
-rw-r--r-- | engines/sci/graphics/cursor.cpp | 52 | ||||
-rw-r--r-- | engines/scumm/he/resource_he.cpp | 47 | ||||
-rw-r--r-- | engines/sword2/music.cpp | 40 | ||||
-rw-r--r-- | engines/sword25/gfx/image/pngloader.cpp | 13 | ||||
-rw-r--r-- | engines/sword25/gfx/image/pngloader.h | 9 | ||||
-rw-r--r-- | engines/sword25/gfx/image/renderedimage.cpp | 28 | ||||
-rw-r--r-- | engines/sword25/gfx/image/swimage.cpp | 4 | ||||
-rw-r--r-- | engines/sword25/kernel/kernel_script.cpp | 117 | ||||
-rw-r--r-- | engines/sword25/package/packagemanager.cpp | 57 | ||||
-rw-r--r-- | engines/tsage/core.cpp | 6 | ||||
-rw-r--r-- | engines/tsage/core.h | 2 | ||||
-rw-r--r-- | engines/tsage/globals.cpp | 2 | ||||
-rw-r--r-- | engines/tsage/graphics.cpp | 2 | ||||
-rw-r--r-- | engines/tsage/ringworld_logic.cpp | 49 | ||||
-rw-r--r-- | engines/tsage/ringworld_logic.h | 1 | ||||
-rw-r--r-- | engines/tsage/ringworld_scenes8.cpp | 8 | ||||
-rw-r--r-- | engines/tsage/ringworld_scenes8.h | 2 |
21 files changed, 194 insertions, 328 deletions
diff --git a/engines/gob/dataio.cpp b/engines/gob/dataio.cpp index 78fc0ab3c1..aa2743b5ed 100644 --- a/engines/gob/dataio.cpp +++ b/engines/gob/dataio.cpp @@ -26,6 +26,7 @@ #include "common/endian.h" #include "common/types.h" #include "common/memstream.h" +#include "common/substream.h" #include "gob/gob.h" #include "gob/dataio.h" @@ -345,9 +346,8 @@ Common::SeekableReadStream *DataIO::getFile(File &file) { if (!file.archive->file.seek(file.offset)) return 0; - Common::SeekableReadStream *rawData = file.archive->file.readStream(file.size); - if (!rawData) - return 0; + Common::SeekableReadStream *rawData = + new Common::SafeSubReadStream(&file.archive->file, file.offset, file.offset + file.size); if (!file.packed) return rawData; diff --git a/engines/gob/save/savehandler.cpp b/engines/gob/save/savehandler.cpp index 8cb8274402..21102ae786 100644 --- a/engines/gob/save/savehandler.cpp +++ b/engines/gob/save/savehandler.cpp @@ -113,8 +113,8 @@ void SlotFileIndexed::buildIndex(byte *buffer, SavePartInfo &info, if (setLongest) { uint32 slot0Len; for (slot0Len = strlen((const char *) bufferStart); slot0Len < longest; slot0Len++) - buffer[slot0Len] = ' '; - buffer[slot0Len] = '\0'; + bufferStart[slot0Len] = ' '; + bufferStart[slot0Len] = '\0'; } } diff --git a/engines/mohawk/cursors.cpp b/engines/mohawk/cursors.cpp index 66669e35c9..3327860913 100644 --- a/engines/mohawk/cursors.cpp +++ b/engines/mohawk/cursors.cpp @@ -29,9 +29,11 @@ #include "common/macresman.h" #include "common/system.h" +#include "common/textconsole.h" #include "common/winexe_ne.h" #include "common/winexe_pe.h" #include "graphics/cursorman.h" +#include "graphics/maccursor.h" #include "graphics/wincursor.h" #ifdef ENABLE_MYST @@ -41,11 +43,6 @@ namespace Mohawk { -static const byte s_bwPalette[] = { - 0x00, 0x00, 0x00, // Black - 0xFF, 0xFF, 0xFF // White -}; - void CursorManager::showCursor() { CursorMan.showMouse(true); } @@ -78,8 +75,13 @@ void CursorManager::setDefaultCursor() { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }; + static const byte bwPalette[] = { + 0x00, 0x00, 0x00, // Black + 0xFF, 0xFF, 0xFF // White + }; + CursorMan.replaceCursor(defaultCursor, 12, 20, 0, 0, 0); - CursorMan.replaceCursorPalette(s_bwPalette, 1, 2); + CursorMan.replaceCursorPalette(bwPalette, 1, 2); } void CursorManager::setCursor(uint16 id) { @@ -87,35 +89,24 @@ void CursorManager::setCursor(uint16 id) { setDefaultCursor(); } -void CursorManager::setMacXorCursor(Common::SeekableReadStream *stream) { +void CursorManager::setMacCursor(Common::SeekableReadStream *stream) { assert(stream); - byte cursorBitmap[16 * 16]; + Graphics::MacCursor *macCursor = new Graphics::MacCursor(); - // Get black and white data - for (int i = 0; i < 32; i++) { - byte imageByte = stream->readByte(); - for (int b = 0; b < 8; b++) - cursorBitmap[i * 8 + b] = (imageByte & (0x80 >> b)) ? 1 : 2; - } + if (!macCursor->readFromStream(*stream)) + error("Could not parse Mac cursor"); - // Apply mask data - for (int i = 0; i < 32; i++) { - byte imageByte = stream->readByte(); - for (int b = 0; b < 8; b++) - if ((imageByte & (0x80 >> b)) == 0) - cursorBitmap[i * 8 + b] = 0; - } - - uint16 hotspotY = stream->readUint16BE(); - uint16 hotspotX = stream->readUint16BE(); + CursorMan.replaceCursor(macCursor->getSurface(), macCursor->getWidth(), macCursor->getHeight(), + macCursor->getHotspotX(), macCursor->getHotspotY(), macCursor->getKeyColor()); + CursorMan.replaceCursorPalette(macCursor->getPalette(), 0, 256); - CursorMan.replaceCursor(cursorBitmap, 16, 16, hotspotX, hotspotY, 0); - CursorMan.replaceCursorPalette(s_bwPalette, 1, 2); + delete macCursor; + delete stream; } void DefaultCursorManager::setCursor(uint16 id) { - setMacXorCursor(_vm->getResource(_tag, id)); + setMacCursor(_vm->getResource(_tag, id)); } #ifdef ENABLE_MYST @@ -223,26 +214,12 @@ void MacCursorManager::setCursor(uint16 id) { // Try a color cursor first Common::SeekableReadStream *stream = _resFork->getResource(MKTAG('c','r','s','r'), id); - if (stream) { - byte *cursor, *palette; - int width, height, hotspotX, hotspotY, keyColor, palSize; - - _resFork->convertCrsrCursor(stream, &cursor, width, height, hotspotX, hotspotY, keyColor, true, &palette, palSize); - - CursorMan.replaceCursor(cursor, width, height, hotspotX, hotspotY, keyColor); - CursorMan.replaceCursorPalette(palette, 0, palSize); - - delete[] cursor; - delete[] palette; - delete stream; - return; - } - - // Fall back to b&w cursors - stream = _resFork->getResource(MKTAG('C','U','R','S'), id); + // Fall back to monochrome cursors + if (!stream) + stream = _resFork->getResource(MKTAG('C','U','R','S'), id); if (stream) { - setMacXorCursor(stream); + setMacCursor(stream); delete stream; } else { setDefaultCursor(); @@ -265,7 +242,7 @@ LivingBooksCursorManager_v2::~LivingBooksCursorManager_v2() { void LivingBooksCursorManager_v2::setCursor(uint16 id) { if (_sysArchive && _sysArchive->hasResource(ID_TCUR, id)) { - setMacXorCursor(_sysArchive->getResource(ID_TCUR, id)); + setMacCursor(_sysArchive->getResource(ID_TCUR, id)); } else { // TODO: Handle generated cursors } diff --git a/engines/mohawk/cursors.h b/engines/mohawk/cursors.h index 1fb8b35714..ba9700c9f9 100644 --- a/engines/mohawk/cursors.h +++ b/engines/mohawk/cursors.h @@ -63,8 +63,8 @@ public: virtual bool hasSource() const { return false; } protected: - // Set a Mac XOR/AND map cursor to the screen - void setMacXorCursor(Common::SeekableReadStream *stream); + // Set a Mac CURS/crsr cursor to the screen + void setMacCursor(Common::SeekableReadStream *stream); }; // The default Mohawk cursor manager diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 3b95a5c955..d4d7dcfd4f 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -25,11 +25,11 @@ #include "common/config-manager.h" #include "common/events.h" -#include "common/macresman.h" #include "common/memstream.h" #include "common/system.h" #include "common/util.h" #include "graphics/cursorman.h" +#include "graphics/maccursor.h" #include "sci/sci.h" #include "sci/event.h" @@ -473,49 +473,19 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu assert(resource); - if (resource->size == 32 * 2 + 4) { - // Mac CURS cursor - // See http://developer.apple.com/legacy/mac/library/documentation/mac/QuickDraw/QuickDraw-402.html - // for more information. - byte *cursorBitmap = new byte[16 * 16]; - byte *data = resource->data; - - // Get B&W data - for (byte i = 0; i < 32; i++) { - byte imageByte = *data++; - for (byte b = 0; b < 8; b++) - cursorBitmap[i * 8 + b] = (byte)((imageByte & (0x80 >> b)) > 0 ? 1 : 2); - } - - // Apply mask data - for (byte i = 0; i < 32; i++) { - byte imageByte = *data++; - for (byte b = 0; b < 8; b++) - if ((imageByte & (0x80 >> b)) == 0) - cursorBitmap[i * 8 + b] = 0; // Doesn't matter, just is transparent - } - - uint16 hotspotY = READ_BE_UINT16(data); - uint16 hotspotX = READ_BE_UINT16(data + 2); - - static const byte cursorPalette[] = { 0x00, 0x00, 0x00, 0xff, 0xff, 0xff }; - - CursorMan.replaceCursor(cursorBitmap, 16, 16, hotspotX, hotspotY, 0); - CursorMan.replaceCursorPalette(cursorPalette, 1, 2); + Common::MemoryReadStream resStream(resource->data, resource->size); + Graphics::MacCursor *macCursor = new Graphics::MacCursor(); - delete[] cursorBitmap; - } else { - // Mac crsr cursor - byte *cursorBitmap, *palette; - int width, height, hotspotX, hotspotY, palSize, keycolor; - Common::MemoryReadStream resStream(resource->data, resource->size); - Common::MacResManager::convertCrsrCursor(&resStream, &cursorBitmap, width, height, hotspotX, hotspotY, keycolor, true, &palette, palSize); - CursorMan.replaceCursor(cursorBitmap, width, height, hotspotX, hotspotY, keycolor); - CursorMan.replaceCursorPalette(palette, 0, palSize); - delete[] cursorBitmap; - delete[] palette; + if (!macCursor->readFromStream(resStream)) { + warning("Failed to load Mac cursor %d", viewNum); + return; } + CursorMan.replaceCursor(macCursor->getSurface(), macCursor->getWidth(), macCursor->getHeight(), + macCursor->getHotspotX(), macCursor->getHotspotY(), macCursor->getKeyColor()); + CursorMan.replaceCursorPalette(macCursor->getPalette(), 0, 256); + + delete macCursor; kernelShow(); } diff --git a/engines/scumm/he/resource_he.cpp b/engines/scumm/he/resource_he.cpp index ecb094f29b..552c420755 100644 --- a/engines/scumm/he/resource_he.cpp +++ b/engines/scumm/he/resource_he.cpp @@ -32,6 +32,7 @@ #include "audio/decoders/wave.h" #include "graphics/cursorman.h" +#include "graphics/maccursor.h" #include "graphics/wincursor.h" #include "common/archive.h" @@ -172,11 +173,49 @@ bool MacResExtractor::extractResource(int id, CachedCursor *cc) { if (!dataStream) return false; - int keyColor; // HACK: key color is ignored - _resMgr->convertCrsrCursor(dataStream, &cc->bitmap, cc->width, cc->height, cc->hotspotX, cc->hotspotY, - keyColor, _vm->_system->hasFeature(OSystem::kFeatureCursorHasPalette), - &cc->palette, cc->palSize); + // If we don't have a cursor palette, force monochrome cursors + bool forceMonochrome = !_vm->_system->hasFeature(OSystem::kFeatureCursorHasPalette); + Graphics::MacCursor *macCursor = new Graphics::MacCursor(); + + if (!macCursor->readFromStream(*dataStream, forceMonochrome)) { + delete dataStream; + delete macCursor; + return false; + } + + cc->bitmap = new byte[macCursor->getWidth() * macCursor->getHeight()]; + cc->width = macCursor->getWidth(); + cc->height = macCursor->getHeight(); + cc->hotspotX = macCursor->getHotspotX(); + cc->hotspotY = macCursor->getHotspotY(); + + if (forceMonochrome) { + // Convert to the SCUMM palette + const byte *srcBitmap = macCursor->getSurface(); + + for (int i = 0; i < macCursor->getWidth() * macCursor->getHeight(); i++) { + if (srcBitmap[i] == macCursor->getKeyColor()) // Transparent + cc->bitmap[i] = 255; + else if (srcBitmap[i] == 0) // Black + cc->bitmap[i] = 253; + else // White + cc->bitmap[i] = 254; + } + } else { + // Copy data and palette + + // Sanity check. This code assumes that the key color is the same + assert(macCursor->getKeyColor() == 255); + + memcpy(cc->bitmap, macCursor->getSurface(), macCursor->getWidth() * macCursor->getHeight()); + + cc->palette = new byte[256 * 3]; + cc->palSize = 256; + memcpy(cc->palette, macCursor->getPalette(), 256 * 3); + } + + delete macCursor; delete dataStream; return true; } diff --git a/engines/sword2/music.cpp b/engines/sword2/music.cpp index 233d9369d2..ae6e2f1268 100644 --- a/engines/sword2/music.cpp +++ b/engines/sword2/music.cpp @@ -53,40 +53,6 @@ namespace Sword2 { -/** - * This class behaves like SeekableSubReadStream, except it remembers where the - * previous read() or seek() took it, so that it can continue from that point - * the next time. This is because we're frequently streaming two pieces of - * music from the same file. - */ -class SafeSubReadStream : public Common::SeekableSubReadStream { -protected: - uint32 _previousPos; -public: - SafeSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end); - virtual uint32 read(void *dataPtr, uint32 dataSize); - virtual bool seek(int32 offset, int whence = SEEK_SET); -}; - -SafeSubReadStream::SafeSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end) - : SeekableSubReadStream(parentStream, begin, end, DisposeAfterUse::NO) { - _previousPos = 0; -} - -uint32 SafeSubReadStream::read(void *dataPtr, uint32 dataSize) { - uint32 result; - SeekableSubReadStream::seek(_previousPos); - result = SeekableSubReadStream::read(dataPtr, dataSize); - _previousPos = pos(); - return result; -} - -bool SafeSubReadStream::seek(int32 offset, int whence) { - bool result = SeekableSubReadStream::seek(offset, whence); - _previousPos = pos(); - return result; -} - static Audio::AudioStream *makeCLUStream(Common::File *fp, int size); static Audio::AudioStream *makePSXCLUStream(Common::File *fp, int size); @@ -197,19 +163,19 @@ static Audio::AudioStream *getAudioStream(SoundFileHandle *fh, const char *base, return makeCLUStream(&fh->file, enc_len); #ifdef USE_MAD case kMP3Mode: { - SafeSubReadStream *tmp = new SafeSubReadStream(&fh->file, pos, pos + enc_len); + Common::SafeSubReadStream *tmp = new Common::SafeSubReadStream(&fh->file, pos, pos + enc_len); return Audio::makeMP3Stream(tmp, DisposeAfterUse::YES); } #endif #ifdef USE_VORBIS case kVorbisMode: { - SafeSubReadStream *tmp = new SafeSubReadStream(&fh->file, pos, pos + enc_len); + Common::SafeSubReadStream *tmp = new Common::SafeSubReadStream(&fh->file, pos, pos + enc_len); return Audio::makeVorbisStream(tmp, DisposeAfterUse::YES); } #endif #ifdef USE_FLAC case kFLACMode: { - SafeSubReadStream *tmp = new SafeSubReadStream(&fh->file, pos, pos + enc_len); + Common::SafeSubReadStream *tmp = new Common::SafeSubReadStream(&fh->file, pos, pos + enc_len); return Audio::makeFLACStream(tmp, DisposeAfterUse::YES); } #endif diff --git a/engines/sword25/gfx/image/pngloader.cpp b/engines/sword25/gfx/image/pngloader.cpp index f6c00b6968..d3c119b1a0 100644 --- a/engines/sword25/gfx/image/pngloader.cpp +++ b/engines/sword25/gfx/image/pngloader.cpp @@ -32,9 +32,6 @@ * */ -// Define to use ScummVM's PNG decoder, instead of libpng -#define USE_INTERNAL_PNG_DECODER - #ifndef USE_INTERNAL_PNG_DECODER // Disable symbol overrides so that we can use png.h #define FORBIDDEN_SYMBOL_ALLOW_ALL @@ -242,8 +239,8 @@ bool PNGLoader::decodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncom return doDecodeImage(fileDataPtr + pngOffset, fileSize - pngOffset, uncompressedDataPtr, width, height, pitch); } -bool PNGLoader::doImageProperties(const byte *fileDataPtr, uint fileSize, int &width, int &height) { #ifndef USE_INTERNAL_PNG_DECODER +bool PNGLoader::doImageProperties(const byte *fileDataPtr, uint fileSize, int &width, int &height) { // Check for valid PNG signature if (!doIsCorrectImageFormat(fileDataPtr, fileSize)) return false; @@ -280,9 +277,7 @@ bool PNGLoader::doImageProperties(const byte *fileDataPtr, uint fileSize, int &w // Destroy libpng structures png_destroy_read_struct(&png_ptr, &info_ptr, NULL); -#else - // We don't need to read the image properties here... -#endif + return true; } @@ -292,5 +287,9 @@ bool PNGLoader::imageProperties(const byte *fileDataPtr, uint fileSize, int &wid return doImageProperties(fileDataPtr + pngOffset, fileSize - pngOffset, width, height); } +#else + // We don't need to read the image properties here... +#endif + } // End of namespace Sword25 diff --git a/engines/sword25/gfx/image/pngloader.h b/engines/sword25/gfx/image/pngloader.h index e0d68ff8b9..fea6ece0e9 100644 --- a/engines/sword25/gfx/image/pngloader.h +++ b/engines/sword25/gfx/image/pngloader.h @@ -40,6 +40,9 @@ namespace Sword25 { +// Define to use ScummVM's PNG decoder, instead of libpng +#define USE_INTERNAL_PNG_DECODER + /** * Class for loading PNG files, and PNG data embedded into savegames. * @@ -50,7 +53,9 @@ protected: PNGLoader() {} // Protected constructor to prevent instances static bool doDecodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch); +#ifndef USE_INTERNAL_PNG_DECODER static bool doImageProperties(const byte *fileDataPtr, uint fileSize, int &width, int &height); +#endif public: @@ -72,6 +77,8 @@ public: byte *&pUncompressedData, int &width, int &height, int &pitch); + +#ifndef USE_INTERNAL_PNG_DECODER /** * Extract the properties of an image. * @param[in] fileDatePtr pointer to the image data @@ -86,6 +93,8 @@ public: static bool imageProperties(const byte *fileDatePtr, uint fileSize, int &width, int &height); +#endif + }; } // End of namespace Sword25 diff --git a/engines/sword25/gfx/image/renderedimage.cpp b/engines/sword25/gfx/image/renderedimage.cpp index 806d9b27ad..132c516c12 100644 --- a/engines/sword25/gfx/image/renderedimage.cpp +++ b/engines/sword25/gfx/image/renderedimage.cpp @@ -36,6 +36,7 @@ // INCLUDES // ----------------------------------------------------------------------------- +#include "common/savefile.h" #include "sword25/package/packagemanager.h" #include "sword25/gfx/image/pngloader.h" #include "sword25/gfx/image/renderedimage.h" @@ -44,6 +45,14 @@ namespace Sword25 { +// Duplicated from kernel/persistenceservice.cpp +static Common::String generateSavegameFilename(uint slotID) { + char buffer[100]; + // NOTE: This is hardcoded to sword25 + snprintf(buffer, 100, "%s.%.3d", "sword25", slotID); + return Common::String(buffer); +} + // ----------------------------------------------------------------------------- // CONSTRUCTION / DESTRUCTION // ----------------------------------------------------------------------------- @@ -62,21 +71,36 @@ RenderedImage::RenderedImage(const Common::String &filename, bool &result) : // Load file byte *pFileData; uint fileSize; - pFileData = pPackage->getFile(filename, &fileSize); + + if (filename.hasPrefix("/saves")) { + // A savegame thumbnail + Common::SaveFileManager *sfm = g_system->getSavefileManager(); + int slotNum = atoi(filename.c_str() + filename.size() - 3); + Common::InSaveFile *file = sfm->openForLoading(generateSavegameFilename(slotNum)); + fileSize = file->size(); + pFileData = new byte[fileSize]; + file->read(pFileData, fileSize); + delete file; + } else { + pFileData = pPackage->getFile(filename, &fileSize); + } + if (!pFileData) { error("File \"%s\" could not be loaded.", filename.c_str()); return; } +#ifndef USE_INTERNAL_PNG_DECODER // Determine image properties - int pitch; if (!PNGLoader::imageProperties(pFileData, fileSize, _width, _height)) { error("Could not read image properties."); delete[] pFileData; return; } +#endif // Uncompress the image + int pitch; if (!PNGLoader::decodeImage(pFileData, fileSize, _data, _width, _height, pitch)) { error("Could not decode image."); delete[] pFileData; diff --git a/engines/sword25/gfx/image/swimage.cpp b/engines/sword25/gfx/image/swimage.cpp index 3b9b939eb3..0f3814eb54 100644 --- a/engines/sword25/gfx/image/swimage.cpp +++ b/engines/sword25/gfx/image/swimage.cpp @@ -56,14 +56,16 @@ SWImage::SWImage(const Common::String &filename, bool &result) : return; } +#ifndef USE_INTERNAL_PNG_DECODER // Determine image properties - int pitch; if (!PNGLoader::imageProperties(pFileData, fileSize, _width, _height)) { error("Could not read image properties."); return; } +#endif // Uncompress the image + int pitch; byte *pUncompressedData; if (!PNGLoader::decodeImage(pFileData, fileSize, pUncompressedData, _width, _height, pitch)) { error("Could not decode image."); diff --git a/engines/sword25/kernel/kernel_script.cpp b/engines/sword25/kernel/kernel_script.cpp index 458f6b2deb..43a144b2c6 100644 --- a/engines/sword25/kernel/kernel_script.cpp +++ b/engines/sword25/kernel/kernel_script.cpp @@ -42,45 +42,9 @@ namespace Sword25 { -static int disconnectService(lua_State *L) { - // This function apparently is not used by the game scripts - lua_pushboolean(L, true); - - return 1; -} - -static int getActiveServiceIdentifier(lua_State *L) { - // This function apparently is not used by the game scripts - lua_pushstring(L, "QUUX"); - - return 1; -} - -static int getSuperclassCount(lua_State *L) { - // This function is only used by a single function in system/kernel.lua which is never called. - lua_pushnumber(L, 0); - - return 1; -} - -static int getSuperclassIdentifier(lua_State *L) { - // This function is only used by a single function in system/kernel.lua which is never called. - lua_pushstring(L, "FOO"); - - return 1; -} - -static int getServiceCount(lua_State *L) { - // This function is only used by a single function in system/kernel.lua which is never called. - lua_pushnumber(L, 0); - - return 1; -} - -static int getServiceIdentifier(lua_State *L) { - // This function is only used by a single function in system/kernel.lua which is never called. - lua_pushstring(L, "BAR"); - +// Marks a function that should never be used +static int dummyFuncError(lua_State *L) { + error("Dummy function invoked by LUA"); return 1; } @@ -177,12 +141,12 @@ static int getUsedMemory(lua_State *L) { static const char *KERNEL_LIBRARY_NAME = "Kernel"; static const luaL_reg KERNEL_FUNCTIONS[] = { - {"DisconnectService", disconnectService}, - {"GetActiveServiceIdentifier", getActiveServiceIdentifier}, - {"GetSuperclassCount", getSuperclassCount}, - {"GetSuperclassIdentifier", getSuperclassIdentifier}, - {"GetServiceCount", getServiceCount}, - {"GetServiceIdentifier", getServiceIdentifier}, + {"DisconnectService", dummyFuncError}, + {"GetActiveServiceIdentifier", dummyFuncError}, + {"GetSuperclassCount", dummyFuncError}, + {"GetSuperclassIdentifier", dummyFuncError}, + {"GetServiceCount", dummyFuncError}, + {"GetServiceIdentifier", dummyFuncError}, {"GetMilliTicks", getMilliTicks}, {"GetTimer", getTimer}, {"StartService", startService}, @@ -241,20 +205,6 @@ static int setY(lua_State *L) { return 0; } -static int getClientX(lua_State *L) { - // This function apparently is not used by the game scripts - lua_pushnumber(L, 0); - - return 1; -} - -static int getClientY(lua_State *L) { - // This function apparently is not used by the game scripts - lua_pushnumber(L, 0); - - return 1; -} - static int getWidth(lua_State *L) { // This function apparently is not used by the game scripts lua_pushnumber(L, 800); @@ -332,20 +282,6 @@ static int closeWanted(lua_State *L) { return 1; } -static int waitForFocus(lua_State *L) { - // This function apparently is not used by the game scripts - lua_pushbooleancpp(L, true); - - return 1; -} - -static int hasFocus(lua_State *L) { - // This function apparently is not used by the game scripts - lua_pushbooleancpp(L, true); - - return 1; -} - static const char *WINDOW_LIBRARY_NAME = "Window"; static const luaL_reg WINDOW_FUNCTIONS[] = { @@ -355,8 +291,8 @@ static const luaL_reg WINDOW_FUNCTIONS[] = { {"SetX", setX}, {"GetY", getY}, {"SetY", setY}, - {"GetClientX", getClientX}, - {"GetClientY", getClientY}, + {"GetClientX", dummyFuncError}, + {"GetClientY", dummyFuncError}, {"GetWidth", getWidth}, {"GetHeight", getHeight}, {"SetWidth", setWidth}, @@ -365,8 +301,8 @@ static const luaL_reg WINDOW_FUNCTIONS[] = { {"SetTitle", setTitle}, {"ProcessMessages", processMessages}, {"CloseWanted", closeWanted}, - {"WaitForFocus", waitForFocus}, - {"HasFocus", hasFocus}, + {"WaitForFocus", dummyFuncError}, + {"HasFocus", dummyFuncError}, {0, 0} }; @@ -436,29 +372,6 @@ static int emptyCache(lua_State *L) { return 0; } -static int isLogCacheMiss(lua_State *L) { - Kernel *pKernel = Kernel::getInstance(); - assert(pKernel); - ResourceManager *pResource = pKernel->getResourceManager(); - assert(pResource); - - // This isn't used in any script - lua_pushbooleancpp(L, false); - - return 1; -} - -static int setLogCacheMiss(lua_State *L) { - Kernel *pKernel = Kernel::getInstance(); - assert(pKernel); - ResourceManager *pResource = pKernel->getResourceManager(); - assert(pResource); - - // This isn't used in any script - - return 0; -} - static int dumpLockedResources(lua_State *L) { Kernel *pKernel = Kernel::getInstance(); assert(pKernel); @@ -478,8 +391,8 @@ static const luaL_reg RESOURCE_FUNCTIONS[] = { {"GetMaxMemoryUsage", getMaxMemoryUsage}, {"SetMaxMemoryUsage", setMaxMemoryUsage}, {"EmptyCache", emptyCache}, - {"IsLogCacheMiss", isLogCacheMiss}, - {"SetLogCacheMiss", setLogCacheMiss}, + {"IsLogCacheMiss", dummyFuncError}, + {"SetLogCacheMiss", dummyFuncError}, {"DumpLockedResources", dumpLockedResources}, {0, 0} }; diff --git a/engines/sword25/package/packagemanager.cpp b/engines/sword25/package/packagemanager.cpp index 7c6343a18f..7a64fe2e29 100644 --- a/engines/sword25/package/packagemanager.cpp +++ b/engines/sword25/package/packagemanager.cpp @@ -141,29 +141,6 @@ bool PackageManager::loadDirectoryAsPackage(const Common::String &directoryName, } } -// Duplicated from kernel/persistenceservice.cpp -static Common::String generateSavegameFilename(uint slotID) { - char buffer[100]; - // NOTE: This is hardcoded to sword25 - snprintf(buffer, 100, "%s.%.3d", "sword25", slotID); - return Common::String(buffer); -} - -// Duplicated from kernel/persistenceservice.cpp -static Common::String loadString(Common::InSaveFile *in, uint maxSize = 999) { - Common::String result; - - char ch = (char)in->readByte(); - while (ch != '\0') { - result += ch; - if (result.size() >= maxSize) - break; - ch = (char)in->readByte(); - } - - return result; -} - byte *PackageManager::getFile(const Common::String &fileName, uint *fileSizePtr) { const Common::String B25S_EXTENSION(".b25s"); Common::SeekableReadStream *in; @@ -188,40 +165,6 @@ byte *PackageManager::getFile(const Common::String &fileName, uint *fileSizePtr) return buffer; } - if (fileName.hasPrefix("/saves")) { - // A savegame thumbnail - Common::SaveFileManager *sfm = g_system->getSavefileManager(); - int slotNum = atoi(fileName.c_str() + fileName.size() - 3); - Common::InSaveFile *file = sfm->openForLoading(generateSavegameFilename(slotNum)); - - if (file) { - loadString(file); // storedMarker - loadString(file); // storedVersionID - loadString(file); // gameDescription - int gameDataLength = atoi(loadString(file).c_str()); - loadString(file); // gamedataUncompressedLength - // Skip the savegame data - file->skip(gameDataLength); - - int thumbnailSize = file->size() - file->pos(); - - if (thumbnailSize <= 0) { - warning("Saved game at slot %d does not contain a thumbnail", slotNum); - delete file; - return 0; - } - - if (fileSizePtr) - *fileSizePtr = thumbnailSize; - - byte *thumbnail = new byte[thumbnailSize]; - file->read(thumbnail, thumbnailSize); - - delete file; - return thumbnail; - } - } - Common::ArchiveMemberPtr fileNode = getArchiveMember(normalizePath(fileName, _currentDirectory)); if (!fileNode) return 0; diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 86219a7908..28d6dbfb19 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2622,6 +2622,12 @@ int Visage::getFrameCount() const { /*--------------------------------------------------------------------------*/ +Player::Player(): SceneObject() { + _canWalk = false; + _uiEnabled = false; + _field8C = 0; +} + void Player::postInit(SceneObjectList *OwnerList) { SceneObject::postInit(); diff --git a/engines/tsage/core.h b/engines/tsage/core.h index d1d3411e5a..a4a0ec208a 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -598,7 +598,7 @@ public: bool _uiEnabled; int _field8C; public: - Player() : SceneObject() {} + Player(); virtual Common::String getClassName() { return "Player"; } virtual void synchronize(Serializer &s); diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index d5d63da76b..74e957580c 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -93,6 +93,8 @@ Globals::Globals() : Globals::~Globals() { _globals = NULL; + delete _inventory; + delete _game; } void Globals::reset() { diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index fbc1e2a359..723e50d338 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -227,6 +227,7 @@ GfxSurface::GfxSurface() : _bounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) { _lockSurfaceCtr = 0; _customSurface = NULL; _screenSurfaceP = NULL; + _transColor = -1; } GfxSurface::GfxSurface(const GfxSurface &s) { @@ -259,6 +260,7 @@ void GfxSurface::create(int width, int height) { _screenSurface = false; _customSurface = new Graphics::Surface(); _customSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); + Common::set_to((byte *)_customSurface->pixels, (byte *)_customSurface->pixels + (width * height), 0); _bounds = Rect(0, 0, width, height); } diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index b22996e916..4321c53c47 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -396,18 +396,18 @@ void SpeakerPOR::setText(const Common::String &msg) { _object1.postInit(&_objectList); _object1.setVisage(7223); _object1.setStrip2(2); - _object1.setPosition(Common::Point(191, 166), 0); - _object1.animate(ANIM_MODE_7, 0, 0); + _object1.setPosition(Common::Point(191, 166)); + _object1.animate(ANIM_MODE_7, 0, NULL); _object2.postInit(&_objectList); _object2.setVisage(7223); - _object2.setPosition(Common::Point(159, 86), 0); - _object2.setAction(&_speakerAction, 0); + _object2.setPosition(Common::Point(159, 86)); + _object2.setAction(&_speakerAction, NULL); _object3.postInit(&_objectList); _object3.setVisage(7223); _object3.setStrip(3); - _object3.setPosition(Common::Point(119, 107), 0); + _object3.setPosition(Common::Point(119, 107)); _object3.fixPriority(199); _object3.setAction(&_action2); @@ -431,8 +431,8 @@ void SpeakerOR::setText(const Common::String &msg) { _object1.fixPriority(255); _object1.changeZoom(100); _object1._frame = 1; - _object1.setPosition(Common::Point(202, 147), 0); - _object1.animate(ANIM_MODE_7, 0, 0); + _object1.setPosition(Common::Point(202, 147)); + _object1.animate(ANIM_MODE_7, 0, NULL); _object2.postInit(&_objectList); _object2.setVisage(9431); @@ -440,8 +440,8 @@ void SpeakerOR::setText(const Common::String &msg) { _object2.fixPriority(255); _object2.setZoom(100); _object2._frame = 1; - _object2.setPosition(Common::Point(199, 85), 0); - _object2.setAction(&_speakerAction, 0); + _object2.setPosition(Common::Point(199, 85)); + _object2.setAction(&_speakerAction, NULL); Speaker::setText(msg); } @@ -518,7 +518,7 @@ SpeakerEText::SpeakerEText() { /*--------------------------------------------------------------------------*/ -SpeakerGR::SpeakerGR() { +SpeakerGR::SpeakerGR() : AnimatedSpeaker() { _speakerName = "GR"; _newSceneNumber = 9220; _textWidth = 136; @@ -526,6 +526,19 @@ SpeakerGR::SpeakerGR() { _color1 = 14; } +void SpeakerGR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(9221); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(101, 70)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + Speaker::setText(msg); +} + /*--------------------------------------------------------------------------*/ SpeakerHText::SpeakerHText() { @@ -541,7 +554,7 @@ SpeakerSKText::SpeakerSKText() : ScreenSpeaker() { _speakerName = "SKTEXT"; _textWidth = 240; _textMode = ALIGN_CENTER; - _color1 = 5; + _color1 = 9; _hideObjects = false; } @@ -600,16 +613,16 @@ SpeakerSKL::SpeakerSKL() : AnimatedSpeaker() { _speakerName = "SKL"; _newSceneNumber = 7011; _textPos = Common::Point(10, 30); - _color1 = 10; + _color1 = 9; } void SpeakerSKL::setText(const Common::String &msg) { _object1.postInit(&_objectList); _object1.setVisage(7013); _object1.setStrip2(2); - _object1._frame = 1; _object1.fixPriority(255); _object1.changeZoom(100); + _object1._frame = 1; _object1.setPosition(Common::Point(203, 120)); _object1.animate(ANIM_MODE_7, 0, NULL); @@ -780,8 +793,8 @@ void SpeakerQU::setText(const Common::String &msg) { _object1.fixPriority(255); _object1.changeZoom(100); _object1._frame = 1; - _object1.setPosition(Common::Point(116, 120), 0); - _object1.animate(ANIM_MODE_7, 0, 0); + _object1.setPosition(Common::Point(116, 120)); + _object1.animate(ANIM_MODE_7, 0, NULL); _object2.postInit(&_objectList); _object2.setVisage(7021); @@ -789,8 +802,8 @@ void SpeakerQU::setText(const Common::String &msg) { _object2.fixPriority(255); _object2.changeZoom(100); _object2._frame = 1; - _object2.setPosition(Common::Point(111, 84), 0); - _object2.setAction(&_speakerAction, 0); + _object2.setPosition(Common::Point(111, 84)); + _object2.setAction(&_speakerAction, NULL); Speaker::setText(msg); } @@ -877,6 +890,7 @@ void SpeakerSAL::setText(const Common::String &msg) { _object2.setVisage(2853); _object2.setStrip2(1); _object2.fixPriority(255); + _object2.changeZoom(100); _object2._frame = 1; _object2.setPosition(Common::Point(170, 92)); _object2.setAction(&_speakerAction, NULL); @@ -980,7 +994,6 @@ void SpeakerCHFR::setText(const Common::String &msg) { /*--------------------------------------------------------------------------*/ SpeakerPL::SpeakerPL() { - // TODO: check initialization of object3 and action2 _speakerName = "PL"; _newSceneNumber = 4060; _textPos = Common::Point(160, 40); diff --git a/engines/tsage/ringworld_logic.h b/engines/tsage/ringworld_logic.h index d790631f2f..e84779e6ad 100644 --- a/engines/tsage/ringworld_logic.h +++ b/engines/tsage/ringworld_logic.h @@ -192,6 +192,7 @@ public: SpeakerGR(); virtual Common::String getClassName() { return "SpeakerGR"; } + virtual void setText(const Common::String &msg); }; class SpeakerHText : public ScreenSpeaker { diff --git a/engines/tsage/ringworld_scenes8.cpp b/engines/tsage/ringworld_scenes8.cpp index 487aaeea53..0969ba8a4e 100644 --- a/engines/tsage/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld_scenes8.cpp @@ -349,8 +349,8 @@ void Scene7000::Action7::signal() { void Scene7000::SceneItem1::doAction(int action) { if (action == CURSOR_LOOK) SceneItem::display2(7000, 2); - - SceneItem::doAction(action); + else + SceneHotspot::doAction(action); } /*--------------------------------------------------------------------------*/ @@ -1602,7 +1602,7 @@ void Scene7600::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene7700::Action1::signal() { - SceneObject *fmtObj = (SceneObject *) _endHandler; + SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler; switch (_actionIndex++) { case 0: { PlayerMover *mover1 = new PlayerMover(); @@ -1612,7 +1612,7 @@ void Scene7700::Action1::signal() { } case 1: _globals->_player.checkAngle(fmtObj); - if (_globals->_player._field8C == 0) + if (fmtObj->_state == 0) fmtObj->animate(ANIM_MODE_5, this); else fmtObj->animate(ANIM_MODE_6, this); diff --git a/engines/tsage/ringworld_scenes8.h b/engines/tsage/ringworld_scenes8.h index a88a01b5a2..c40a43eba6 100644 --- a/engines/tsage/ringworld_scenes8.h +++ b/engines/tsage/ringworld_scenes8.h @@ -95,7 +95,7 @@ class Scene7000 : public Scene { }; /* Items */ - class SceneItem1 : public SceneItem { + class SceneItem1 : public SceneHotspot { public: virtual void doAction(int action); }; |