Exemplo n.º 1
0
SaveStateDescriptor TonyMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
    Common::String saveName;
    byte difficulty;
    byte thumbData[160 * 120 * 2];

    if (Tony::RMOptionScreen::loadThumbnailFromSaveState(slot, thumbData, saveName, difficulty)) {
        // Convert the 565 thumbnail data to the needed overlay format
        Common::MemoryReadStream thumbStream(thumbData, 160 * 120 * 2);
        Graphics::PixelFormat destFormat = g_system->getOverlayFormat();
        Graphics::Surface *to = new Graphics::Surface();
        to->create(160, 120, destFormat);

        OverlayColor *pixels = (OverlayColor *)to->pixels;
        for (int y = 0; y < to->h; ++y) {
            for (int x = 0; x < to->w; ++x) {
                uint8 r, g, b;
                Graphics::colorToRGB<Graphics::ColorMasks<555> >(thumbStream.readUint16LE(), r, g, b);

                // converting to current OSystem Color
                *pixels++ = destFormat.RGBToColor(r, g, b);
            }
        }

        // Create the return descriptor
        SaveStateDescriptor desc(slot, saveName);
        desc.setDeletableFlag(true);
        desc.setWriteProtectedFlag(false);
        desc.setThumbnail(to);

        return desc;
    }

    return SaveStateDescriptor();
}
void BasePersistenceManager::getSaveStateDesc(int slot, SaveStateDescriptor &desc) {
	Common::String filename = getFilenameForSlot(slot);
	debugC(kWintermuteDebugSaveGame, "Trying to list savegame %s in slot %d", filename.c_str(), slot);
	if (DID_FAIL(readHeader(filename))) {
		warning("getSavedDesc(%d) - Failed for %s", slot, filename.c_str());
		return;
	}
	desc.setSaveSlot(slot);
	desc.setDescription(_savedDescription);
	desc.setDeletableFlag(true);
	desc.setWriteProtectedFlag(false);

	if (_thumbnailDataSize > 0) {
		Common::MemoryReadStream thumbStream(_thumbnailData, _thumbnailDataSize);
		Graphics::BitmapDecoder bmpDecoder;
		if (bmpDecoder.loadStream(thumbStream)) {
			Graphics::Surface *surf = NULL;
			surf = bmpDecoder.getSurface()->convertTo(g_system->getOverlayFormat());
			TransparentSurface *scaleableSurface = new TransparentSurface(*surf, false);
			Graphics::Surface *scaled = scaleableSurface->scale(kThumbnailWidth, kThumbnailHeight2);
			desc.setThumbnail(scaled);
			delete scaleableSurface;
			delete surf;
		}
	}

	desc.setSaveDate(_savedTimestamp.tm_year, _savedTimestamp.tm_mon, _savedTimestamp.tm_mday);
	desc.setSaveTime(_savedTimestamp.tm_hour, _savedTimestamp.tm_min);
	desc.setPlayTime(0);
}
Exemplo n.º 3
0
void BasePersistenceManager::getSaveStateDesc(int slot, SaveStateDescriptor &desc) {
    Common::String filename = getFilenameForSlot(slot);
    debugC(kWintermuteDebugSaveGame, "Trying to list savegame %s in slot %d", filename.c_str(), slot);
    if (DID_FAIL(readHeader(filename))) {
        debugC(kWintermuteDebugSaveGame, "getSavedDesc(%d) - Failed for %s", slot, filename.c_str());
        return;
    }
    desc.setSaveSlot(slot);
    desc.setDescription(_savedDescription);
    desc.setDeletableFlag(true);
    desc.setWriteProtectedFlag(false);

    int thumbSize = 0;
    byte *thumbData = nullptr;
    if (_scummVMThumbSize > 0) {
        thumbSize = _scummVMThumbSize;
        thumbData = _scummVMThumbnailData;
    } else if (_thumbnailDataSize > 0) {
        thumbSize = _thumbnailDataSize;
        thumbData = _thumbnailData;
    }

    if (thumbSize > 0) {
        Common::MemoryReadStream thumbStream(thumbData, thumbSize, DisposeAfterUse::NO);
        Graphics::BitmapDecoder bmpDecoder;
        if (bmpDecoder.loadStream(thumbStream)) {
            const Graphics::Surface *bmpSurface = bmpDecoder.getSurface();
            TransparentSurface *scaleableSurface = new TransparentSurface(*bmpSurface, false);
            Graphics::Surface *scaled = scaleableSurface->scale(kThumbnailWidth, kThumbnailHeight2);
            Graphics::Surface *thumb = scaled->convertTo(g_system->getOverlayFormat());
            desc.setThumbnail(thumb);
            delete scaleableSurface;
            scaled->free();
            delete scaled;
        }
    }

    desc.setSaveDate(_savedTimestamp.tm_year, _savedTimestamp.tm_mon, _savedTimestamp.tm_mday);
    desc.setSaveTime(_savedTimestamp.tm_hour, _savedTimestamp.tm_min);
    desc.setPlayTime(0);
}
Exemplo n.º 4
0
bool BasePersistenceManager::initSave(const char *desc) {
    if (!desc) {
        return STATUS_FAILED;
    }

    cleanup();
    _saving = true;

    _saveStream = new Common::MemoryWriteStreamDynamic(DisposeAfterUse::YES);

    if (_saveStream) {
        // get thumbnails
        if (!_gameRef->_cachedThumbnail) {
            _gameRef->_cachedThumbnail = new SaveThumbHelper(_gameRef);
            if (DID_FAIL(_gameRef->_cachedThumbnail->storeThumbnail(true))) {
                delete _gameRef->_cachedThumbnail;
                _gameRef->_cachedThumbnail = nullptr;
            }
        }

        uint32 magic = DCGF_MAGIC;
        putDWORD(magic);

        magic = SAVE_MAGIC_3;
        putDWORD(magic);

        byte verMajor, verMinor, extMajor, extMinor;
        _gameRef->getVersion(&verMajor, &verMinor, &extMajor, &extMinor);
        _saveStream->writeByte(verMajor);
        _saveStream->writeByte(verMinor);
        _saveStream->writeByte(extMajor);
        _saveStream->writeByte(extMinor);

        // new in ver 2
        putDWORD((uint32)DCGF_VER_BUILD);
        putString(_gameRef->getName());

        // thumbnail data size
        bool thumbnailOK = false;

        if (_gameRef->_cachedThumbnail) {
            if (_gameRef->_cachedThumbnail->_thumbnail) {
                Common::MemoryWriteStreamDynamic thumbStream(DisposeAfterUse::YES);
                if (_gameRef->_cachedThumbnail->_thumbnail->writeBMPToStream(&thumbStream)) {
                    _saveStream->writeUint32LE(thumbStream.size());
                    _saveStream->write(thumbStream.getData(), thumbStream.size());
                } else {
                    _saveStream->writeUint32LE(0);
                }

                thumbnailOK = true;
            }
        }
        if (!thumbnailOK) {
            putDWORD(0);
        }
        thumbnailOK = false;
        // Again for the ScummVM-thumb:
        if (_gameRef->_cachedThumbnail) {
            if (_gameRef->_cachedThumbnail->_scummVMThumb) {
                Common::MemoryWriteStreamDynamic scummVMthumbStream(DisposeAfterUse::YES);
                if (_gameRef->_cachedThumbnail->_scummVMThumb->writeBMPToStream(&scummVMthumbStream)) {
                    _saveStream->writeUint32LE(scummVMthumbStream.size());
                    _saveStream->write(scummVMthumbStream.getData(), scummVMthumbStream.size());
                } else {
                    _saveStream->writeUint32LE(0);
                }

                thumbnailOK = true;
            }
        }
        if (!thumbnailOK) {
            putDWORD(0);
        }


        // in any case, destroy the cached thumbnail once used
        delete _gameRef->_cachedThumbnail;
        _gameRef->_cachedThumbnail = nullptr;

        uint32 dataOffset = _offset +
                            sizeof(uint32) + // data offset
                            sizeof(uint32) + strlen(desc) + 1 + // description
                            sizeof(uint32); // timestamp

        putDWORD(dataOffset);
        putString(desc);

        g_system->getTimeAndDate(_savedTimestamp);
        putTimeDate(_savedTimestamp);
        _savedPlayTime = g_system->getMillis();
        _saveStream->writeUint32LE(_savedPlayTime);
    }
    return STATUS_OK;
}