From bb4ea153ffa5eaf5be3e912e206566f7c9278a87 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Thu, 20 Jun 2013 16:39:05 -0400 Subject: FULLPIPE: Started scene loading --- engines/fullpipe/fullpipe.cpp | 3 --- engines/fullpipe/fullpipe.h | 5 ++++- engines/fullpipe/scene.cpp | 47 +++++++++++++++++++++++++++++++++++++++- engines/fullpipe/scene.h | 35 +++++++++++++++++------------- engines/fullpipe/stateloader.cpp | 2 ++ engines/fullpipe/utils.cpp | 12 ++++++++++ engines/fullpipe/utils.h | 2 ++ 7 files changed, 86 insertions(+), 20 deletions(-) (limited to 'engines') diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp index 6df26afe44..d49fe9a773 100644 --- a/engines/fullpipe/fullpipe.cpp +++ b/engines/fullpipe/fullpipe.cpp @@ -28,7 +28,6 @@ #include "engines/util.h" #include "fullpipe/fullpipe.h" -#include "fullpipe/ngiarchive.h" #include "fullpipe/objectnames.h" #include "fullpipe/objects.h" @@ -66,8 +65,6 @@ Common::Error FullpipeEngine::run() { loadGam("fullpipe.gam"); - Common::Archive *arch = makeNGIArchive("3896.nl"); - return Common::kNoError; } diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h index 52c0fd89a1..ce6935c25d 100644 --- a/engines/fullpipe/fullpipe.h +++ b/engines/fullpipe/fullpipe.h @@ -44,8 +44,10 @@ enum FullpipeGameFeatures { }; class CGameLoader; +class GameProject; class CGameVar; class CInventory2; +class Scene; extern int g_gameProjectVersion; extern int g_gameProjectValue; @@ -76,6 +78,7 @@ public: void updateEvents(); CGameLoader *_gameLoader; + GameProject *_gameProject; bool loadGam(const char *fname); int _gameProjectVersion; @@ -95,7 +98,7 @@ public: void setObjectState(const char *name, int state); int getObjectEnumState(const char *name, const char *state); - void accessScene(int sceneId); + Scene *accessScene(int sceneId); public: diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp index 3b4b3086d8..96ca7c05e6 100644 --- a/engines/fullpipe/scene.cpp +++ b/engines/fullpipe/scene.cpp @@ -23,10 +23,28 @@ #include "fullpipe/fullpipe.h" #include "fullpipe/objects.h" +#include "fullpipe/ngiarchive.h" namespace Fullpipe { -void FullpipeEngine::accessScene(int sceneId) { +Scene *FullpipeEngine::accessScene(int sceneId) { + SceneTag *t = 0; + + for (SceneTagList::iterator s = _gameProject->_sceneTagList->begin(); s != _gameProject->_sceneTagList->end(); ++s) { + if (s->_sceneId == sceneId) { + t = &(*s); + break; + } + } + + if (!t) + return 0; + + if (!t->_scene) { + t->loadScene(); + } + + return t->_scene; } bool SceneTagList::load(MfcArchive &file) { @@ -63,4 +81,31 @@ SceneTag::~SceneTag() { free(_tag); } +void SceneTag::loadScene() { + char *archname = genFileName(0, _sceneId, "nl"); + + Common::Archive *arch = makeNGIArchive(archname); + + char *fname = genFileName(0, _sceneId, "sc"); + + Common::SeekableReadStream *file = arch->createReadStreamForMember(fname); + + _scene = new Scene(); + + //_scene->load(*file); + + delete file; + + free(fname); + free(archname); + +} + +Scene::Scene() { +} + +bool Scene::load(MfcArchive &file) { + return true; +} + } // End of namespace Fullpipe diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h index ee2ddd982b..d049267ad4 100644 --- a/engines/fullpipe/scene.h +++ b/engines/fullpipe/scene.h @@ -25,11 +25,29 @@ namespace Fullpipe { +class Scene : public CObject { + Background bg; + CPtrList staticANIObjectList1; + CPtrList staticANIObjectList2; + CPtrList messageQueueList; + CPtrList faObjectList; + Shadows *shadows; + int soundList; + int16 sceneId; + int stringObj; + int field_BC; + int libHandle; + + public: + Scene(); + virtual bool load(MfcArchive &file); +}; + class SceneTag : public CObject { public: int _field_4; char *_tag; - int _scene; + Scene *_scene; int16 _sceneId; int16 _field_12; @@ -38,6 +56,7 @@ class SceneTag : public CObject { ~SceneTag(); virtual bool load(MfcArchive &file); + void loadScene(); }; class SceneTagList : public Common::List, public CObject { @@ -45,20 +64,6 @@ class SceneTagList : public Common::List, public CObject { virtual bool load(MfcArchive &file); }; -class Scene { - Background bg; - CPtrList staticANIObjectList1; - CPtrList staticANIObjectList2; - CPtrList messageQueueList; - CPtrList faObjectList; - Shadows *shadows; - int soundList; - int16 sceneId; - int stringObj; - int field_BC; - int libHandle; -}; - } // End of namespace Fullpipe #endif /* FULLPIPE_SCENE_H */ diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp index a85e7f3c0c..ea3655e763 100644 --- a/engines/fullpipe/stateloader.cpp +++ b/engines/fullpipe/stateloader.cpp @@ -91,6 +91,8 @@ bool CGameLoader::load(MfcArchive &file) { _gameProject->load(file); + g_fullpipe->_gameProject = _gameProject; + if (g_gameProjectVersion < 12) { error("Old gameProjectVersion: %d", g_gameProjectVersion); } diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp index b3d035bf06..26c03ceeea 100644 --- a/engines/fullpipe/utils.cpp +++ b/engines/fullpipe/utils.cpp @@ -285,4 +285,16 @@ CObject *MfcArchive::parseClass(bool *isCopyReturned) { return res; } +char *genFileName(int superId, int sceneId, const char *ext) { + char *s = (char *)calloc(256, 1); + + if (superId) { + snprintf(s, 255, "%04d%04d.%s", superId, sceneId, ext); + } else { + snprintf(s, 255, "%04d.%s", sceneId, ext); + } + + return s; +} + } // End of namespace Fullpipe diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h index 88a06417cf..409c5ded1a 100644 --- a/engines/fullpipe/utils.h +++ b/engines/fullpipe/utils.h @@ -102,6 +102,8 @@ struct CNode { typedef Common::Array CPtrList; +char *genFileName(int superId, int sceneId, const char *ext); + } // End of namespace Fullpipe #endif /* FULLPIPE_UTILS_H */ -- cgit v1.2.3