From 6a26539abbf7951f4783935b336dcabfbf548055 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 15 Mar 2016 23:49:18 -0400 Subject: TITANIC: Fleshing out resource key and view loading --- engines/titanic/core/resource_key.cpp | 34 ++++++++++++++++++++++++++++++++-- engines/titanic/core/resource_key.h | 11 +++++++++++ engines/titanic/core/view_item.cpp | 6 ++++++ engines/titanic/core/view_item.h | 5 +++++ engines/titanic/files_manager.cpp | 15 ++++++++++++--- engines/titanic/files_manager.h | 8 +++++++- engines/titanic/game_manager.cpp | 4 ++++ engines/titanic/game_manager.h | 2 ++ engines/titanic/main_game_window.cpp | 9 +++++++-- engines/titanic/main_game_window.h | 2 +- engines/titanic/string.cpp | 11 +++++++++++ engines/titanic/string.h | 10 ++++++++++ engines/titanic/titanic.cpp | 6 ++++++ engines/titanic/titanic.h | 1 + 14 files changed, 115 insertions(+), 9 deletions(-) (limited to 'engines') diff --git a/engines/titanic/core/resource_key.cpp b/engines/titanic/core/resource_key.cpp index eee749f15a..685e026d23 100644 --- a/engines/titanic/core/resource_key.cpp +++ b/engines/titanic/core/resource_key.cpp @@ -20,6 +20,7 @@ * */ +#include "common/file.h" #include "titanic/simple_file.h" #include "titanic/core/resource_key.h" @@ -36,12 +37,41 @@ void CResourceKey::save(SimpleFile *file, int indent) const { void CResourceKey::load(SimpleFile *file) { int val = file->readNumber(); - if (val == 1) { + if (val == 0 || val == 1) { file->readBuffer(); - _value = file->readString(); + CString str = file->readString(); + setValue(str); } CSaveableObject::load(file); } +void CResourceKey::setValue(const CString &name) { + CString nameStr = name; + nameStr.toLowercase(); + _key = nameStr; + + _value = nameStr; + int idx = _value.lastIndexOf('\\'); + if (idx >= 0) + _value = _value.mid(idx + 1); +} + +CString CResourceKey::exists() { + CString name = _key; + + // Check for the resource being within an ST container file + int idx = name.indexOf('#'); + if (idx >= 0) { + CString str = name.left(idx); + name = name.mid(idx + 1); + name += ".st"; + } + + // The original did tests for the file in the different + // asset paths, which aren't needed in ScummVM + Common::File f; + return f.exists(name) ? name : CString(); +} + } // End of namespace Titanic diff --git a/engines/titanic/core/resource_key.h b/engines/titanic/core/resource_key.h index b38448aa4f..a165a11e1a 100644 --- a/engines/titanic/core/resource_key.h +++ b/engines/titanic/core/resource_key.h @@ -32,6 +32,8 @@ class CResourceKey: public CSaveableObject { private: CString _key; CString _value; + + void setValue(const CString &name); public: CLASSDEF @@ -45,7 +47,16 @@ public: */ virtual void load(SimpleFile *file); + /** + * Return the key + */ const CString &getString() const { return _key; } + + /** + * Checks whether a file for the given key exists, + * and returns it's filename if it does + */ + CString exists(); }; } // End of namespace Titanic diff --git a/engines/titanic/core/view_item.cpp b/engines/titanic/core/view_item.cpp index 5253f24749..7038e94538 100644 --- a/engines/titanic/core/view_item.cpp +++ b/engines/titanic/core/view_item.cpp @@ -67,4 +67,10 @@ void CViewItem::load(SimpleFile *file) { CNamedItem::load(file); } +bool CViewItem::getResourceKey(CResourceKey *key) { + *key = _resourceKey; + CString filename = key->exists(); + return !filename.empty(); +} + } // End of namespace Titanic diff --git a/engines/titanic/core/view_item.h b/engines/titanic/core/view_item.h index 805b7a4f9c..106c795773 100644 --- a/engines/titanic/core/view_item.h +++ b/engines/titanic/core/view_item.h @@ -52,6 +52,11 @@ public: * Load the data for the class from file */ virtual void load(SimpleFile *file); + + /** + * Get the resource key for the view + */ + bool getResourceKey(CResourceKey *key); }; } // End of namespace Titanic diff --git a/engines/titanic/files_manager.cpp b/engines/titanic/files_manager.cpp index 4dcee2e062..b7562b638a 100644 --- a/engines/titanic/files_manager.cpp +++ b/engines/titanic/files_manager.cpp @@ -20,16 +20,18 @@ * */ +#include "common/file.h" #include "titanic/files_manager.h" #include "titanic/game_manager.h" namespace Titanic { CFilesManager::CFilesManager() : _gameManager(nullptr), - _field0(0), _field14(0), _field18(0), _field1C(0), _field3C(0) { + _assetsPath("Assets"), _field0(0), _field14(0), + _field18(0), _field1C(0), _field3C(0) { } -int CFilesManager::fn1(const CString &name) { +bool CFilesManager::fn1(const CString &name) { if (name.empty()) return 0; @@ -50,7 +52,14 @@ int CFilesManager::fn1(const CString &name) { str += ".st"; } - return 0; + + + return true; +} + +bool CFilesManager::fileExists(const CString &name) { + Common::File f; + return f.exists(name); } } // End of namespace Titanic diff --git a/engines/titanic/files_manager.h b/engines/titanic/files_manager.h index 29a67e6605..63eda5ec1e 100644 --- a/engines/titanic/files_manager.h +++ b/engines/titanic/files_manager.h @@ -43,6 +43,7 @@ private: int _field18; int _field1C; int _field3C; + const CString _assetsPath; public: CFilesManager(); @@ -53,7 +54,12 @@ public: _gameManager = gameManager; } - int fn1(const CString &name); + bool fn1(const CString &name); + + /** + * Returns true if a file of the given name exists + */ + static bool fileExists(const CString &name); }; } // End of namespace Titanic diff --git a/engines/titanic/game_manager.cpp b/engines/titanic/game_manager.cpp index 2f718626e9..5d5dc164ed 100644 --- a/engines/titanic/game_manager.cpp +++ b/engines/titanic/game_manager.cpp @@ -92,4 +92,8 @@ void CGameManager::initBounds() { _bounds = Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); } +void CGameManager::fn2() { + warning("TODO"); +} + } // End of namespace Titanic diff --git a/engines/titanic/game_manager.h b/engines/titanic/game_manager.h index 82ab6d1e3b..6a4905239e 100644 --- a/engines/titanic/game_manager.h +++ b/engines/titanic/game_manager.h @@ -102,6 +102,8 @@ public: * Set default screen bounds */ void initBounds(); + + void fn2(); }; } // End of namespace Titanic diff --git a/engines/titanic/main_game_window.cpp b/engines/titanic/main_game_window.cpp index e9fb423bd1..bf5ec6efd1 100644 --- a/engines/titanic/main_game_window.cpp +++ b/engines/titanic/main_game_window.cpp @@ -96,8 +96,13 @@ int CMainGameWindow::selectSavegame() { return -1; } -void CMainGameWindow::setActiveView(CViewItem *view) { - warning("TODO"); +void CMainGameWindow::setActiveView(CViewItem *viewItem) { + _gameManager->_gameState._gameLocation.setView(viewItem); + + CResourceKey key; + if (viewItem->getResourceKey(&key)) { + // TODO + } } void CMainGameWindow::fn2() { diff --git a/engines/titanic/main_game_window.h b/engines/titanic/main_game_window.h index ec8eff3ec6..eedac23ef8 100644 --- a/engines/titanic/main_game_window.h +++ b/engines/titanic/main_game_window.h @@ -72,7 +72,7 @@ public: /** * Sets the view to be shown */ - void setActiveView(CViewItem *view); + void setActiveView(CViewItem *viewItem); void fn2(); }; diff --git a/engines/titanic/string.cpp b/engines/titanic/string.cpp index f726f78c21..c1afb4ff52 100644 --- a/engines/titanic/string.cpp +++ b/engines/titanic/string.cpp @@ -40,9 +40,20 @@ CString CString::mid(uint start, uint count) const { return CString(c_str() + start, MIN(count, size() - start)); } +CString CString::mid(uint start) const { + uint strSize = size(); + assert(start <= strSize); + return mid(start, strSize - start); +} + int CString::indexOf(char c) { const char *charP = strchr(c_str(), c); return charP ? charP - c_str() : -1; } +int CString::lastIndexOf(char c) { + const char *charP = strrchr(c_str(), c); + return charP ? charP - c_str() : -1; +} + } // End of namespace Titanic diff --git a/engines/titanic/string.h b/engines/titanic/string.h index de442647ca..d70e23d023 100644 --- a/engines/titanic/string.h +++ b/engines/titanic/string.h @@ -52,10 +52,20 @@ public: */ CString mid(uint start, uint count) const; + /** + * Returns a substring from within the string + */ + CString mid(uint start) const; + /** * Returns the index of the first occurance of a given character */ int indexOf(char c); + + /** + * Returns the index of the last occurance of a given character + */ + int lastIndexOf(char c); }; } // End of namespace Titanic diff --git a/engines/titanic/titanic.cpp b/engines/titanic/titanic.cpp index d1d8386228..a9d0cc9421 100644 --- a/engines/titanic/titanic.cpp +++ b/engines/titanic/titanic.cpp @@ -21,6 +21,7 @@ */ #include "common/scummsys.h" +#include "common/archive.h" #include "common/config-manager.h" #include "common/debug-channels.h" #include "common/events.h" @@ -55,6 +56,11 @@ TitanicEngine::~TitanicEngine() { CSaveableObject::freeClassList(); } +void TitanicEngine::initializePath(const Common::FSNode &gamePath) { + Engine::initializePath(gamePath); + SearchMan.addSubDirectoryMatching(gamePath, "assets"); +} + void TitanicEngine::initialize() { // Set up debug channels DebugMan.addDebugChannel(kDebugCore, "core", "Core engine debug level"); diff --git a/engines/titanic/titanic.h b/engines/titanic/titanic.h index 9513f8d759..112d6d63c1 100644 --- a/engines/titanic/titanic.h +++ b/engines/titanic/titanic.h @@ -91,6 +91,7 @@ protected: int _loadSaveSlot; // Engine APIs + virtual void initializePath(const Common::FSNode &gamePath); virtual Common::Error run(); virtual bool hasFeature(EngineFeature f) const; public: -- cgit v1.2.3