[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