From 41a3c83bc6444550c9e4ea1a5918450403e0e5ee Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 22 Jul 2016 12:44:14 -0400 Subject: TITANIC: Fleshing out PET RealLife Load functionality --- engines/titanic/game_manager.cpp | 7 +++++-- engines/titanic/game_manager.h | 5 +++++ engines/titanic/pet_control/pet_load.cpp | 28 ++++++++++++++++++++++++++- engines/titanic/pet_control/pet_load.h | 5 +++++ engines/titanic/pet_control/pet_load_save.cpp | 20 ++++++------------- engines/titanic/pet_control/pet_load_save.h | 9 ++++----- engines/titanic/pet_control/pet_save.cpp | 15 ++++++++++++++ engines/titanic/pet_control/pet_save.h | 7 ++++++- 8 files changed, 73 insertions(+), 23 deletions(-) diff --git a/engines/titanic/game_manager.cpp b/engines/titanic/game_manager.cpp index 06704995bd..2f83bca867 100644 --- a/engines/titanic/game_manager.cpp +++ b/engines/titanic/game_manager.cpp @@ -47,13 +47,16 @@ CGameManager::CGameManager(CProjectItem *project, CGameView *gameView): CGameManager::~CGameManager() { delete _movie; delete _movieSurface; + destroyTreeItem(); + _project->resetGameManager(); +} + +void CGameManager::destroyTreeItem() { if (_treeItem) { _treeItem->destroyAll(); _treeItem = nullptr; } - - _project->resetGameManager(); } void CGameManager::save(SimpleFile *file) { diff --git a/engines/titanic/game_manager.h b/engines/titanic/game_manager.h index 129ce6b175..4808b260b7 100644 --- a/engines/titanic/game_manager.h +++ b/engines/titanic/game_manager.h @@ -81,6 +81,11 @@ public: CGameManager(CProjectItem *project, CGameView *gameView); ~CGameManager(); + /** + * Destroys and allocated tree item + */ + void destroyTreeItem(); + /** * Save data to a save file */ diff --git a/engines/titanic/pet_control/pet_load.cpp b/engines/titanic/pet_control/pet_load.cpp index f4be690bd2..cb3514ee56 100644 --- a/engines/titanic/pet_control/pet_load.cpp +++ b/engines/titanic/pet_control/pet_load.cpp @@ -22,6 +22,8 @@ #include "titanic/pet_control/pet_load.h" #include "titanic/pet_control/pet_control.h" +#include "titanic/core/project_item.h" +#include "titanic/game_manager.h" namespace Titanic { @@ -38,12 +40,36 @@ bool CPetLoad::reset() { return true; } +bool CPetLoad::MouseButtonUpMsg(const Point &pt) { + if (_btnLoadSave.MouseButtonUpMsg(pt)) { + execute(); + return true; + } else { + return false; + } +} + void CPetLoad::getTooltip(CPetText *text) { text->setText("Load the game."); } void CPetLoad::execute() { - warning("TODO: CPetLoad::execute"); + CPetControl *pet = getPetControl(); + + if (_savegameSlotNum >= 0 && _slotInUse[_savegameSlotNum]) { + CProjectItem *project = pet ? pet->getRoot() : nullptr; + CGameManager *gameManager = project ? project->getGameManager() : nullptr; + + if (project && gameManager) { + pet->displayMessage("Loading the selected game, please wait."); + + gameManager->destroyTreeItem(); + gameManager->initBounds(); + project->loadGame(_savegameSlotNum); + } + } else if (pet) { + pet->displayMessage("You must select a game to load first."); + } } } // End of namespace Titanic diff --git a/engines/titanic/pet_control/pet_load.h b/engines/titanic/pet_control/pet_load.h index f87cd8afb2..ad0b026818 100644 --- a/engines/titanic/pet_control/pet_load.h +++ b/engines/titanic/pet_control/pet_load.h @@ -34,6 +34,11 @@ public: */ virtual bool reset(); + /** + * Handles mouse button up messages + */ + virtual bool MouseButtonUpMsg(const Point &pt); + /** * Highlight any currently highlighted element */ diff --git a/engines/titanic/pet_control/pet_load_save.cpp b/engines/titanic/pet_control/pet_load_save.cpp index 17e6f5eee5..77b6126249 100644 --- a/engines/titanic/pet_control/pet_load_save.cpp +++ b/engines/titanic/pet_control/pet_load_save.cpp @@ -81,16 +81,6 @@ bool CPetLoadSave::MouseButtonDownMsg(const Point &pt) { return false; } -bool CPetLoadSave::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { - if (_btnLoadSave.MouseButtonUpMsg(msg->_mousePos)) { - execute(); - resetSlots(); - return true; - } else { - return false; - } -} - bool CPetLoadSave::KeyCharMsg(Common::KeyCode key) { switch (key) { case Common::KEYCODE_TAB: @@ -128,6 +118,7 @@ Rect CPetLoadSave::getSlotBounds(int index) { void CPetLoadSave::resetSlots() { for (int idx = 0; idx < SAVEGAME_SLOTS_COUNT; ++idx) { _slotNames[idx].setText("Empty"); + _slotInUse[idx] = false; // Try and open up the savegame for access Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading( @@ -139,16 +130,17 @@ void CPetLoadSave::resetSlots() { file.open(in); TitanicSavegameHeader header; - CProjectItem::readSavegameHeader(&file, header); + if (CProjectItem::readSavegameHeader(&file, header)) { + _slotInUse[idx] = true; + _slotNames[idx].setText(header._saveName); + } + if (header._thumbnail) { header._thumbnail->free(); delete header._thumbnail; } file.close(); - - // Set the name text - _slotNames[idx].setText(header._saveName); } } diff --git a/engines/titanic/pet_control/pet_load_save.h b/engines/titanic/pet_control/pet_load_save.h index 8f8634dfdf..687bd13e58 100644 --- a/engines/titanic/pet_control/pet_load_save.h +++ b/engines/titanic/pet_control/pet_load_save.h @@ -58,6 +58,7 @@ private: bool isSlotHighlighted(int index, const Point &pt); protected: CPetText _slotNames[SAVEGAME_SLOTS_COUNT]; + bool _slotInUse[SAVEGAME_SLOTS_COUNT]; CPetGfxElement _btnLoadSave; CPetGfxElement _gutter; static int _savegameSlotNum; @@ -87,16 +88,14 @@ public: */ virtual bool MouseButtonDownMsg(const Point &pt); - /** - * Handles mouse button messages - */ - virtual bool MouseButtonDownMsg(CMouseButtonDownMsg *msg); - /** * Handles keypresses when the glyph is focused */ virtual bool KeyCharMsg(Common::KeyCode key); + /** + * Resets highlighting on the save slots + */ virtual void resetSaves() { resetSlots(); } /** diff --git a/engines/titanic/pet_control/pet_save.cpp b/engines/titanic/pet_control/pet_save.cpp index a2e458b52a..341053948e 100644 --- a/engines/titanic/pet_control/pet_save.cpp +++ b/engines/titanic/pet_control/pet_save.cpp @@ -38,6 +38,21 @@ bool CPetSave::reset() { return true; } +bool CPetSave::MouseButtonUpMsg(const Point &pt) { + if (_btnLoadSave.MouseButtonUpMsg(pt)) { + execute(); + resetSlots(); + return true; + } else { + return false; + } +} + +void CPetSave::highlightCurrent() { + resetSlots(); + highlightSave(_savegameSlotNum); +} + void CPetSave::getTooltip(CPetText *text) { text->setText("Save the game."); } diff --git a/engines/titanic/pet_control/pet_save.h b/engines/titanic/pet_control/pet_save.h index 106d499d96..d37f4e3012 100644 --- a/engines/titanic/pet_control/pet_save.h +++ b/engines/titanic/pet_control/pet_save.h @@ -34,6 +34,11 @@ public: */ virtual bool reset(); + /** + * Handles mouse button up messages + */ + virtual bool MouseButtonUpMsg(const Point &pt); + /** * Unhighlight any currently highlighted element */ @@ -42,7 +47,7 @@ public: /** * Highlight any currently highlighted element */ - virtual void highlightCurrent() { highlightSave(_savegameSlotNum); } + virtual void highlightCurrent(); /** * Returns the tooltip text for when the glyph is selected -- cgit v1.2.3