diff options
author | whiterandrek | 2018-04-06 10:03:56 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2018-06-28 23:51:32 +0200 |
commit | 78c4ed85ab7a84b18c8c7fd2e93c6bf2798acab6 (patch) | |
tree | ca77eaa6eb335e6eb57fcbd50e2515d26eb7fffe /engines/pink/objects/pages | |
parent | c29b1d1112b70fcb017359f9a28eb8b7de49a5ab (diff) | |
download | scummvm-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.cpp | 83 | ||||
-rw-r--r-- | engines/pink/objects/pages/game_page.h | 19 | ||||
-rw-r--r-- | engines/pink/objects/pages/page.cpp | 17 | ||||
-rw-r--r-- | engines/pink/objects/pages/page.h | 14 |
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 |