[Scummvm-git-logs] scummvm master -> ae268bf990a2615983311bb594cb09bf17a01850

whiterandrek whiterandrek at gmail.com
Fri Oct 9 15:16:57 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
05f8dc3a95 PETKA: fix crash after starting panel 2nd time
ae268bf990 PETKA: implement saving/loading through ingame interface


Commit: 05f8dc3a95e4e3ea902a5b737f43bc48172ed409
    https://github.com/scummvm/scummvm/commit/05f8dc3a95e4e3ea902a5b737f43bc48172ed409
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-10-09T18:12:23+03:00

Commit Message:
PETKA: fix crash after starting panel 2nd time

Changed paths:
    engines/petka/interfaces/panel.cpp


diff --git a/engines/petka/interfaces/panel.cpp b/engines/petka/interfaces/panel.cpp
index 2547991935..35bcdf147e 100644
--- a/engines/petka/interfaces/panel.cpp
+++ b/engines/petka/interfaces/panel.cpp
@@ -131,6 +131,7 @@ void InterfacePanel::onLeftButtonDown(Common::Point p) {
 		g_vm->loadPart(1);
 		break;
 	case kLoadButtonIndex:
+		stop();
 		g_vm->getQSystem()->_saveLoadInterface->start(kLoadMode);
 		break;
 	case kContinueButtonIndex:
@@ -140,6 +141,7 @@ void InterfacePanel::onLeftButtonDown(Common::Point p) {
 		g_system->quit();
 		break;
 	case kSaveButtonIndex:
+		stop();
 		g_vm->getQSystem()->_saveLoadInterface->start(kSaveMode);
 		break;
 	case kSubtitleButtonIndex:


Commit: ae268bf990a2615983311bb594cb09bf17a01850
    https://github.com/scummvm/scummvm/commit/ae268bf990a2615983311bb594cb09bf17a01850
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-10-09T18:15:31+03:00

Commit Message:
PETKA: implement saving/loading through ingame interface

Changed paths:
    engines/petka/interfaces/panel.cpp
    engines/petka/interfaces/save_load.cpp
    engines/petka/interfaces/save_load.h
    engines/petka/metaengine.cpp
    engines/petka/petka.cpp
    engines/petka/petka.h
    engines/petka/q_system.cpp
    engines/petka/saveload.cpp


diff --git a/engines/petka/interfaces/panel.cpp b/engines/petka/interfaces/panel.cpp
index 35bcdf147e..bfc17cc2e9 100644
--- a/engines/petka/interfaces/panel.cpp
+++ b/engines/petka/interfaces/panel.cpp
@@ -24,6 +24,7 @@
 #include "common/system.h"
 
 #include "petka/objects/object_cursor.h"
+#include "petka/objects/object_case.h"
 #include "petka/petka.h"
 #include "petka/q_system.h"
 #include "petka/flc.h"
@@ -91,9 +92,16 @@ InterfacePanel::InterfacePanel() {
 }
 
 void InterfacePanel::start(int id) {
+	QSystem *sys = g_vm->getQSystem();
 	readSettings();
 
-	QSystem *sys = g_vm->getQSystem();
+	sys->getCase()->show(false);
+
+	g_vm->videoSystem()->makeAllDirty();
+	g_vm->videoSystem()->update();
+
+	InterfaceSaveLoad::saveScreen();
+
 	QObjectBG *bg = (QObjectBG *)sys->findObject(kPanelObjName);
 	_objs.push_back(bg);
 
diff --git a/engines/petka/interfaces/save_load.cpp b/engines/petka/interfaces/save_load.cpp
index d3cae8f557..42c128b4cb 100644
--- a/engines/petka/interfaces/save_load.cpp
+++ b/engines/petka/interfaces/save_load.cpp
@@ -20,6 +20,15 @@
  *
  */
 
+#include "common/system.h"
+
+#include "engines/advancedDetector.h"
+
+#include "graphics/fonts/ttf.h"
+#include "graphics/font.h"
+
+#include "graphics/thumbnail.h"
+
 #include "petka/petka.h"
 #include "petka/q_system.h"
 #include "petka/q_manager.h"
@@ -47,13 +56,47 @@ InterfaceSaveLoad::InterfaceSaveLoad() {
 
 void InterfaceSaveLoad::start(int id) {
 	QSystem *sys = g_vm->getQSystem();
+	QManager *resMgr = g_vm->resMgr();
+	QObjectBG *bg = (QObjectBG *)sys->findObject("SAVELOAD");
 
 	_loadMode = (id == kLoadMode);
 
-	QObjectBG *bg = (QObjectBG *)sys->findObject("SAVELOAD");
 	_objs.push_back(bg);
 	bg->_resourceId = kFirstSaveLoadPageId + _page + (_loadMode ? 0 : 5);
 
+	resMgr->removeResource(bg->_resourceId);
+	auto bmp = resMgr->loadBitmap(bg->_resourceId);
+
+	Graphics::ManagedSurface surf(bmp->w, bmp->h, bmp->format);
+	surf.blitFrom(*bmp);
+
+	Common::ScopedPtr<Graphics::Font> font(Graphics::loadTTFFontFromArchive("FreeSans.ttf", 20));
+
+	MetaEngine &metaEngine = PetkaEngine::getMetaEngine();
+	for (int i = 0, j = _page * 6; i < 6; ++i, ++j) {
+		SaveStateDescriptor save = metaEngine.querySaveMetaInfos(g_vm->_desc->gameId, j);
+
+		auto surface = save.getThumbnail();
+		if (!surface)
+			continue;
+
+		Common::ScopedPtr<Graphics::Surface, Graphics::SurfaceDeleter> thumbnail(surface->scale(108, 82, true));
+		thumbnail.reset(thumbnail->convertTo(g_system->getOverlayFormat()));
+
+		surf.blitFrom(*thumbnail, Common::Point(_saveRects[i].left, _saveRects[i].top));
+
+		Common::Rect textRect(240, 30);
+		textRect.translate(_saveRects[i].left, _saveRects[i].bottom + 1);
+
+		Common::ScopedPtr<Graphics::Surface, Graphics::SurfaceDeleter> text(new Graphics::Surface);
+		text->create(textRect.width(), textRect.height(), g_system->getScreenFormat());
+		font->drawString(text.get(), save.getSaveDate() + " " + save.getSaveTime(), 0, 0, textRect.width(), text->format.RGBToColor(0, 0x7F, 00));
+
+		surf.transBlitFrom(*text, Common::Point(textRect.left, textRect.top));
+	}
+
+	bmp->copyFrom(surf.rawSurface());
+
 	SubInterface::start(id);
 }
 
@@ -62,13 +105,16 @@ void InterfaceSaveLoad::onLeftButtonDown(Common::Point p) {
 	if (index == -1) {
 		if (_prevPageRect.contains(p) && _page > 0) {
 			_page--;
+			stop();
+			start(_loadMode ? kLoadMode : kSaveMode);
 		} else if (_nextPageRect.contains(p) && _page < 2) {
 			_page++;
+			stop();
+			start(_loadMode ? kLoadMode : kSaveMode);
 		}
-		stop();
-		start(_loadMode ? kLoadMode : kSaveMode);
 	} else {
-
+		stop();
+		_loadMode ? g_vm->loadGameState(_page * 6 + index) : g_vm->saveGameState(_page * 6 + index, "", false);
 	}
 }
 
@@ -91,5 +137,11 @@ int InterfaceSaveLoad::findSaveLoadRectIndex(Common::Point p) {
 	return -1;
 }
 
+void InterfaceSaveLoad::saveScreen() {
+	Common::ScopedPtr<Common::MemoryWriteStreamDynamic> thumbnail(new Common::MemoryWriteStreamDynamic(DisposeAfterUse::NO));
+	Graphics::saveThumbnail(*thumbnail);
+	g_vm->_thumbnail.reset(new Common::MemoryReadStream(thumbnail->getData(), thumbnail->size(), DisposeAfterUse::YES));
+}
+
 } // End of namespace Petka
 
diff --git a/engines/petka/interfaces/save_load.h b/engines/petka/interfaces/save_load.h
index 81823e1ee4..810d52ccbe 100644
--- a/engines/petka/interfaces/save_load.h
+++ b/engines/petka/interfaces/save_load.h
@@ -44,6 +44,8 @@ public:
 	void onRightButtonDown(Common::Point p) override;
 	void onMouseMove(Common::Point p) override;
 
+	static void saveScreen();
+
 private:
 	int findSaveLoadRectIndex(Common::Point p);
 
diff --git a/engines/petka/metaengine.cpp b/engines/petka/metaengine.cpp
index 18c3729ca6..1cc08b1d90 100644
--- a/engines/petka/metaengine.cpp
+++ b/engines/petka/metaengine.cpp
@@ -34,7 +34,7 @@ public:
 	}
 
     virtual bool hasFeature(MetaEngineFeature f) const override;
-	virtual int getMaximumSaveSlot() const override { return 18; }
+	virtual int getMaximumSaveSlot() const override { return 17; }
 	virtual SaveStateList listSaves(const char *target) const override;
 	virtual void removeSaveState(const char *target, int slot) const override;
 	virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
@@ -44,6 +44,7 @@ public:
 bool PetkaMetaEngine::hasFeature(MetaEngineFeature f) const {
 	return
 		(f == kSupportsListSaves) ||
+		(f == kSupportsLoadingDuringStartup) ||
 		(f == kSupportsDeleteSave) ||
 		(f == kSavesSupportMetaInfo) ||
 		(f == kSavesSupportThumbnail) ||
@@ -88,6 +89,7 @@ SaveStateDescriptor PetkaMetaEngine::querySaveMetaInfos(const char *target, int
 		if (!Petka::readSaveHeader(*f.get(), desc, false))
 			return SaveStateDescriptor();
 
+		desc.setSaveSlot(slot);
 		return desc;
 	}
 
diff --git a/engines/petka/petka.cpp b/engines/petka/petka.cpp
index 6e9a423f2b..109e013491 100644
--- a/engines/petka/petka.cpp
+++ b/engines/petka/petka.cpp
@@ -20,6 +20,7 @@
  *
  */
 
+#include "common/config-manager.h"
 #include "common/debug-channels.h"
 #include "common/error.h"
 #include "common/events.h"
@@ -57,7 +58,7 @@ PetkaEngine::PetkaEngine(OSystem *system, const ADGameDescription *desc)
 	DebugMan.addDebugChannel(kPetkaDebugMessagingSystem, "message_system", "Engine message system");
 	DebugMan.addDebugChannel(kPetkaDebugDialogs, "dialogs", "Dialogs");
 
-	_part = 0;
+	_part = 0xFF;
 	_chapter = 0;
 	_shouldChangePart = false;
 	_nextPart = 0;
@@ -92,7 +93,11 @@ Common::Error PetkaEngine::run() {
 	_soundMgr.reset(new SoundMgr(*this));
 	_vsys.reset(new VideoSystem(*this));
 
-	loadPart(2);
+	loadPart(0);
+
+	if (ConfMan.hasKey("save_slot")) {
+		loadGameState(ConfMan.getInt("save_slot"));
+	}
 
 	while (!shouldQuit()) {
 		Common::Event event;
diff --git a/engines/petka/petka.h b/engines/petka/petka.h
index a32c9db8d1..ee01290f30 100644
--- a/engines/petka/petka.h
+++ b/engines/petka/petka.h
@@ -25,6 +25,7 @@
 
 #include "common/random.h"
 #include "common/stream.h"
+#include "common/memstream.h"
 #include "common/savefile.h"
 
 #include "engines/engine.h"
@@ -32,6 +33,8 @@
 
 #include "gui/debugger.h"
 
+#include "graphics/surface.h"
+
 /*
  *  This is the namespace of the Petka engine.
  *
@@ -108,6 +111,9 @@ public:
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave) override;
 	bool canSaveGameStateCurrently() override;
 
+	const ADGameDescription *const _desc;
+	Common::ScopedPtr<Common::MemoryReadStream> _thumbnail;
+
 protected:
 	void pauseEngineIntern(bool pause) override;
 
@@ -123,7 +129,6 @@ private:
 	Common::ScopedPtr<VideoSystem> _vsys;
 	Common::ScopedPtr<BigDialogue> _dialogMan;
 	Common::ScopedPtr<Video::VideoDecoder> _videoDec;
-	const ADGameDescription *_desc;
 
 	Common::RandomSource _rnd;
 
diff --git a/engines/petka/q_system.cpp b/engines/petka/q_system.cpp
index a537b6adf3..8cd5283ebf 100644
--- a/engines/petka/q_system.cpp
+++ b/engines/petka/q_system.cpp
@@ -24,6 +24,8 @@
 #include "common/substream.h"
 #include "common/system.h"
 
+#include "graphics/thumbnail.h"
+
 #include "petka/petka.h"
 #include "petka/interfaces/startup.h"
 #include "petka/interfaces/main.h"
@@ -413,9 +415,11 @@ void QSystem::onEvent(const Common::Event &event) {
 		case Common::KEYCODE_ESCAPE:
 			goPrevInterface();
 			break;
-		case Common::KEYCODE_F2:
+		case Common::KEYCODE_F2: {
+			InterfaceSaveLoad::saveScreen();
 			startSaveLoad(kSaveMode);
 			break;
+		}
 		case Common::KEYCODE_F3:
 			startSaveLoad(kLoadMode);
 			break;
diff --git a/engines/petka/saveload.cpp b/engines/petka/saveload.cpp
index 242a12ee61..e283553b3a 100644
--- a/engines/petka/saveload.cpp
+++ b/engines/petka/saveload.cpp
@@ -28,13 +28,16 @@
 #include "graphics/thumbnail.h"
 
 #include "petka/petka.h"
+#include "petka/objects/object_star.h"
 #include "petka/q_system.h"
+#include "petka/interfaces/panel.h"
 #include "petka/interfaces/save_load.h"
+#include "petka/interfaces/main.h"
 
 namespace Petka {
 
 Common::Error PetkaEngine::loadGameState(int slot) {
-	Common::SeekableReadStream *in = _saveFileMan->openForLoading(generateSaveName(slot, _targetName.c_str()));
+	Common::ScopedPtr<Common::SeekableReadStream> in(_saveFileMan->openForLoading(generateSaveName(slot, _targetName.c_str())));
 	if (!in)
 		return Common::kNoGameDataFoundError;
 
@@ -48,18 +51,17 @@ Common::Error PetkaEngine::loadGameState(int slot) {
 	_chapter = in->readUint32LE();
 	if (_nextPart == _part) {
 		loadChapter(_chapter);
-		_qsystem->load(in);
+		_qsystem->load(in.get());
 	} else {
 		_shouldChangePart = true;
 		_saveSlot = slot;
 	}
 
-	delete in;
 	return Common::kNoError;
 }
 
 Common::Error PetkaEngine::saveGameState(int slot, const Common::String &desci, bool isAutosave) {
-	Common::OutSaveFile *out = _saveFileMan->openForSaving(generateSaveName(slot, _targetName.c_str()));
+	Common::ScopedPtr<Common::OutSaveFile> out(_saveFileMan->openForSaving(generateSaveName(slot, _targetName.c_str())));
 	if (!out)
 		return Common::kUnknownError;
 
@@ -75,27 +77,33 @@ Common::Error PetkaEngine::saveGameState(int slot, const Common::String &desci,
 
 	out->writeUint32LE(getTotalPlayTime() / 1000);
 
-	if (!Graphics::saveThumbnail(*out))
+	if (!_thumbnail)
 		return Common::kUnknownError;
 
+	out->writeStream(_thumbnail.get());
+
 	out->writeUint32LE(_part);
 	out->writeUint32LE(_chapter);
-	_qsystem->save(out);
+	_qsystem->save(out.get());
 
-	delete out;
 	return Common::kNoError;
 }
 
 bool PetkaEngine::canSaveGameStateCurrently() {
-	return true;
-	InterfaceSaveLoad *interface =_qsystem->_saveLoadInterface.get();
-	return (interface == _qsystem->_currInterface && !interface->loadMode());
+	if (isDemo() || !_qsystem)
+		return false;
+
+	Interface *panel = _qsystem->_panelInterface.get();
+	InterfaceSaveLoad *saveLoad = _qsystem->_saveLoadInterface.get();
+
+	Interface *curr = _qsystem->_currInterface;
+	Interface *prev = _qsystem->_prevInterface;
+
+	return prev == _qsystem->_mainInterface.get() && (curr == saveLoad || curr == panel);
 }
 
 bool PetkaEngine::canLoadGameStateCurrently() {
-	return true;
-	InterfaceSaveLoad *interface =_qsystem->_saveLoadInterface.get();
-	return (interface == _qsystem->_currInterface && interface->loadMode());
+	return !isDemo();
 }
 
 int PetkaEngine::getSaveSlot() {




More information about the Scummvm-git-logs mailing list