aboutsummaryrefslogtreecommitdiff
path: root/engines/pink/objects/pages
diff options
context:
space:
mode:
authorwhiterandrek2018-04-06 10:03:56 +0300
committerEugene Sandulenko2018-06-28 23:51:32 +0200
commit78c4ed85ab7a84b18c8c7fd2e93c6bf2798acab6 (patch)
treeca77eaa6eb335e6eb57fcbd50e2515d26eb7fffe /engines/pink/objects/pages
parentc29b1d1112b70fcb017359f9a28eb8b7de49a5ab (diff)
downloadscummvm-rg350-78c4ed85ab7a84b18c8c7fd2e93c6bf2798acab6.tar.gz
scummvm-rg350-78c4ed85ab7a84b18c8c7fd2e93c6bf2798acab6.tar.bz2
scummvm-rg350-78c4ed85ab7a84b18c8c7fd2e93c6bf2798acab6.zip
PINK: implemented page state saving
Diffstat (limited to 'engines/pink/objects/pages')
-rw-r--r--engines/pink/objects/pages/game_page.cpp83
-rw-r--r--engines/pink/objects/pages/game_page.h19
-rw-r--r--engines/pink/objects/pages/page.cpp17
-rw-r--r--engines/pink/objects/pages/page.h14
4 files changed, 89 insertions, 44 deletions
diff --git a/engines/pink/objects/pages/game_page.cpp b/engines/pink/objects/pages/game_page.cpp
index c878180c4a..d12c034d2a 100644
--- a/engines/pink/objects/pages/game_page.cpp
+++ b/engines/pink/objects/pages/game_page.cpp
@@ -30,6 +30,24 @@
namespace Pink {
+GamePage::GamePage()
+ : _cursorMgr(nullptr), _walkMgr(nullptr), _sequencer(nullptr),
+ _perhapsIsLoaded(false), _memFile(nullptr)
+{}
+
+GamePage::~GamePage() {
+ clear();
+}
+
+void GamePage::toConsole() {
+ Page::toConsole();
+ _walkMgr->toConsole();
+ _sequencer->toConsole();
+ for (int i = 0; i < _handlers.size(); ++i) {
+ _handlers[i]->toConsole();
+ }
+}
+
void GamePage::deserialize(Archive &archive) {
Page::deserialize(archive);
_module = static_cast<Module*>(archive.readObject());
@@ -52,10 +70,9 @@ void GamePage::load(Archive &archive) {
}
void GamePage::init(bool isLoadingSave) {
- if (!isLoadingSave){
- //assert(perhapsIsLoaded == 0);
+ if (!_perhapsIsLoaded)
loadManagers();
- }
+
getGame()->getDirector()->clear();
toConsole();
@@ -91,15 +108,18 @@ bool GamePage::initHandler() {
}
void GamePage::loadManagers() {
- perhapsIsLoaded = true;
+ _perhapsIsLoaded = true;
_cursorMgr = new CursorMgr(_module->getGame(), this);
_walkMgr = new WalkMgr;
_sequencer = new Sequencer(this);
_resMgr.init(_module->getGame(), this);
- // memfile manipulations if from save or page changing
-
+ if (_memFile != nullptr) {
+ loadState();
+ delete _memFile;
+ _memFile = nullptr;
+ }
}
PinkEngine *GamePage::getGame() {
@@ -128,28 +148,49 @@ WalkMgr *GamePage::getWalkMgr() {
return _walkMgr;
}
-void GamePage::toConsole() {
- Page::toConsole();
- _walkMgr->toConsole();
- _sequencer->toConsole();
- for (int i = 0; i < _handlers.size(); ++i) {
- _handlers[i]->toConsole();
+void GamePage::loadState() {
+ Archive archive(static_cast<Common::SeekableReadStream*>(_memFile));
+ archive >> _variables;
+
+ uint16 actorCount;
+ archive >> actorCount;
+
+ Common::String actorName;
+ for (int i = 0; i < actorCount; ++i) {
+ actorName = archive.readString();
+ findActor(actorName)->loadState(archive);
}
}
-GamePage::~GamePage() {
- delete _cursorMgr;
- delete _walkMgr;
- delete _sequencer;
- for (int i = 0; i < _handlers.size(); ++i) {
- delete _handlers[i];
+void GamePage::saveState() {
+ _memFile = new Common::MemoryReadWriteStream(DisposeAfterUse::YES);
+ Archive archive(static_cast<Common::WriteStream*>(_memFile));
+ archive << _variables;
+
+ archive.writeWORD(_actors.size());
+ for (int i = 0; i < _actors.size(); ++i) {
+ archive.writeString(_actors[i]->getName());
+ _actors[i]->saveState(archive);
}
}
-GamePage::GamePage()
- : _cursorMgr(nullptr), _walkMgr(nullptr), _sequencer(nullptr)
-{
+void GamePage::unload() {
+ _leadActor->setAction(_leadActor->findAction("Idle"));
+ saveState();
+ clear();
+}
+void GamePage::clear() {
+ Page::clear();
+ _variables.clear(1);
+ for (int i = 0; i < _handlers.size(); ++i) {
+ delete _handlers[i];
+ }
+ _handlers.clear();
+ delete _cursorMgr;
+ delete _sequencer;
+ delete _walkMgr;
}
+
} // End of namespace Pink \ No newline at end of file
diff --git a/engines/pink/objects/pages/game_page.h b/engines/pink/objects/pages/game_page.h
index 705fb32e22..79a4bee4db 100644
--- a/engines/pink/objects/pages/game_page.h
+++ b/engines/pink/objects/pages/game_page.h
@@ -23,6 +23,7 @@
#ifndef PINK_GAME_PAGE_H
#define PINK_GAME_PAGE_H
+#include <common/memstream.h>
#include "page.h"
namespace Pink {
@@ -36,12 +37,12 @@ class GamePage : public Page {
public:
GamePage();
~GamePage();
+ virtual void toConsole();
virtual void deserialize(Archive &archive);
virtual void load(Archive &archive);
-
+ void unload();
void loadManagers();
-
void init(bool isLoadingSave);
PinkEngine *getGame();
@@ -52,25 +53,21 @@ public:
bool checkValueOfVariable(Common::String &variable, Common::String &value);
void setVariable(Common::String &variable, Common::String &value);
- virtual void toConsole();
+ virtual void clear();
private:
bool initHandler();
+ void loadState();
+ void saveState();
-
- int perhapsIsLoaded;
+ bool _perhapsIsLoaded;
+ Common::MemoryReadWriteStream *_memFile;
Module *_module;
CursorMgr *_cursorMgr;
WalkMgr *_walkMgr;
Sequencer *_sequencer;
Common::Array<HandlerStartPage*> _handlers;
Common::StringMap _variables;
-
- /*
- int cunk_1;
- int memfile;
- int unk;
- */
};
}
diff --git a/engines/pink/objects/pages/page.cpp b/engines/pink/objects/pages/page.cpp
index 471cf8736b..e068367d07 100644
--- a/engines/pink/objects/pages/page.cpp
+++ b/engines/pink/objects/pages/page.cpp
@@ -22,10 +22,15 @@
#include "page.h"
#include "engines/pink/objects/actors/lead_actor.h"
+#include "engines/pink/director.h"
namespace Pink {
+Page::~Page() {
+ clear();
+}
+
void Page::load(Archive &archive) {
archive.mapObject(this);
NamedObject::deserialize(archive);
@@ -65,14 +70,18 @@ void Page::init() {
}
}
-Page::~Page() {
+LeadActor *Page::getLeadActor() {
+ return _leadActor;
+}
+
+void Page::clear() {
for (int i = 0; i < _actors.size(); ++i) {
delete _actors[i];
}
+ _actors.clear();
+ _resMgr.clear();
}
-LeadActor *Page::getLeadActor() {
- return _leadActor;
-}
+
} // End of namespace Pink
diff --git a/engines/pink/objects/pages/page.h b/engines/pink/objects/pages/page.h
index 7eb1a335f3..b9820fea75 100644
--- a/engines/pink/objects/pages/page.h
+++ b/engines/pink/objects/pages/page.h
@@ -37,25 +37,23 @@ class LeadActor;
class Page : public NamedObject {
public:
~Page();
+ virtual void toConsole();
+
void load(Archive &archive);
Actor *findActor(Common::String &name);
+ LeadActor *getLeadActor();
+
Sound *loadSound(Common::String &fileName);
CelDecoder *loadCel(Common::String &fileName);
- virtual void toConsole();
-
- LeadActor *getLeadActor();
+ virtual void clear();
protected:
void init();
+
Common::Array<Actor*> _actors;
ResourceMgr _resMgr;
LeadActor *_leadActor;
-
- /*
- int unk_1;
- CString _str;
- */
};
} // End of namespace Pink