Browse Source

Start loading of triggers implementation

Paul 11 years ago
parent
commit
611c945fa2

+ 4 - 3
QGearsMain/CMakeLists.txt

@@ -148,6 +148,7 @@ include/data/worldmap/MapFile.h
   include/data/QGearsSerializer.h
   include/data/QGearsTexCodec.h
   include/data/QGearsTexFile.h
+  include/data/QGearsTriggersFile.h
 )
 
 set(SOURCE_FILES_DATA
@@ -196,7 +197,7 @@ set(SOURCE_FILES_DATA
   src/data/QGearsSerializer.cpp
   src/data/QGearsTexCodec.cpp
   src/data/QGearsTexFile.cpp
-
+  src/data/QGearsTriggersFile.cpp
 )
 
 set(SOURCE_FILES
@@ -336,9 +337,9 @@ add_library(QGearsMain STATIC
 )
 
 # Coverage uses more memory, combined with PCH can cause OOM/ICE
-if ($ENV{COVERAGE}!=1)
+#if ($ENV{COVERAGE}!=1)
 cotire(QGearsMain)
-endif()
+#endif()
 SET_PROPERTY(TARGET QGearsMain PROPERTY FOLDER "q-gears")
 
 add_library(q-gears-data STATIC

+ 1 - 1
QGearsMain/include/common/TypeDefine.h

@@ -60,7 +60,7 @@ namespace QGears
     extern const String    EXT_TIM;
     extern const String    EXT_TEX;
 
-
+    extern const String    EXT_TRIGGERS;
     extern const String    EXT_BACKGROUND;
     extern const String    EXT_CAMERA_MATRIX;
     extern const String    EXT_MODEL_LIST;

+ 1 - 1
QGearsMain/include/data/QGearsBackgroundFileSerializer.h

@@ -39,7 +39,7 @@ namespace QGears
                         BackgroundFileSerializer();
         virtual        ~BackgroundFileSerializer();
 
-        virtual void    importBackgroundFile( Ogre::DataStreamPtr &stream, BackgroundFile *pDest );
+        void    importBackgroundFile( Ogre::DataStreamPtr &stream, BackgroundFile *pDest );
 
         enum {
             BIT_MASK_RED    = 0xF800

+ 4 - 0
QGearsMain/include/data/QGearsFLevelFile.h

@@ -39,6 +39,7 @@ THE SOFTWARE.
 #include "QGearsCameraMatrixFile.h"
 #include "QGearsPaletteFile.h"
 #include "QGearsHRCFile.h"
+#include "QGearsTriggersFile.h"
 
 namespace QGears
 {
@@ -67,6 +68,7 @@ namespace QGears
         const ModelListFilePtr&     getModelList() const;
         const PaletteFilePtr&       getPalette() const;
         const WalkmeshFilePtr&      getWalkmesh() const;
+        const TriggersFilePtr&      getTriggers() const;
 
         void setRawScript(const std::vector<u8>& scriptData);
         void setBackground  ( const BackgroundFilePtr      &background    );
@@ -74,6 +76,7 @@ namespace QGears
         void setModelList   ( const ModelListFilePtr       &model_list    );
         void setPalette     ( const PaletteFilePtr         &palette       );
         void setWalkmesh    ( const WalkmeshFilePtr        &walkmesh      );
+        void setTriggers(const TriggersFilePtr& triggers);
 
         String getBackground2DName( void ) const;
         String getBackgroundTextureName( void ) const;
@@ -100,6 +103,7 @@ namespace QGears
         ModelListFilePtr            m_model_list;
         PaletteFilePtr              m_palette;
         WalkmeshFilePtr             m_walkmesh;
+        TriggersFilePtr             m_triggers;
         std::vector<u8>             m_rawScript;
 
         FLevelTextureLoader        *m_background_texture_loader;

+ 1 - 0
QGearsMain/include/data/QGearsFLevelFileSerializer.h

@@ -75,6 +75,7 @@ namespace QGears
         void    readPalette     ( Ogre::DataStreamPtr &stream, FLevelFile* pDest );
         void    readWalkmesh    ( Ogre::DataStreamPtr &stream, FLevelFile* pDest );
         void    readBackground  ( Ogre::DataStreamPtr &stream, FLevelFile* pDest );
+        void    readTriggers    (Ogre::DataStreamPtr &stream, FLevelFile* pDest);
 
         void    readEnd( Ogre::DataStreamPtr &stream );
 

+ 128 - 0
QGearsMain/include/data/QGearsTriggersFile.h

@@ -0,0 +1,128 @@
+#pragma once
+
+#include <OgreResourceManager.h>
+#include "QGearsPrerequisites.h"
+#include "common/QGearsResource.h"
+#include "QGearsSerializer.h"
+
+namespace QGears
+{
+    class TriggersFileManager :
+        public Ogre::ResourceManager, 
+        public Ogre::Singleton<TriggersFileManager>
+    {
+    public:
+        TriggersFileManager();
+        virtual ~TriggersFileManager();
+        static TriggersFileManager& getSingleton();
+        static TriggersFileManager* getSingletonPtr();
+    protected:
+        virtual Ogre::Resource *createImpl(
+            const Ogre::String &name,
+            Ogre::ResourceHandle handle,
+            const Ogre::String& group,
+            bool isManual,
+            Ogre::ManualResourceLoader* loader,
+            const Ogre::NameValuePairList* createParams) override;
+    };
+
+    class TriggersFile : public Resource
+    {
+    public:
+        TriggersFile(Ogre::ResourceManager* creator, 
+            const String &name,
+            Ogre::ResourceHandle handle,
+            const String& group, 
+            bool isManual = false,
+            Ogre::ManualResourceLoader* loader = nullptr);
+        virtual ~TriggersFile();
+        static const String RESOURCE_TYPE;
+    protected:
+        virtual void loadImpl(void) override;
+        virtual void unloadImpl(void) override;
+        virtual size_t calculateSize(void) const override;
+    private:
+        struct Range 
+        {
+            s16 left;
+            s16 top;
+            s16 right;
+            s16 bottom;
+        };
+
+        struct Vertex_s 
+        {
+            u16 x;
+            u16 y;
+            u16 z;
+        };
+
+        struct Exit
+        {
+            Vertex_s exit_line[2];
+            Vertex_s destination;
+            u16 fieldID;
+            u8 dir, dir_copy1, dir_copy2, dir_copy3;
+        };
+
+        struct Trigger
+        {
+            Vertex_s trigger_line[2];
+            u8 background_parameter;
+            u8 background_state;
+            u8 behavior;
+            /* 0 - OnTrigger - ON
+            * 1 - OnTrigger - OFF
+            * 2 - OnTrigger - ON, AwayFromTrigger - OFF
+            * 3 - OnTrigger - OFF, AwayFromTrigger - ON
+            * 4 - OnTrigger - ON, AwayFromTriggerOnPlusSide - OFF
+            * 5 - OnTrigger - OFF, AwayFromTriggerOnPlusSide - ON
+            */
+            u8 soundID;
+        };
+
+        struct Arrow
+        {
+            s32 positionX;
+            s32 positionZ;
+            s32 positionY;
+            u32 type;// 0 - Invisible, 1 - Red, 2 - Green
+        };
+
+        struct TriggerData
+        {
+            char name[9];
+            u8 control;
+            s16 cameraFocusHeight;
+            Range camera_range; // 8 bytes
+            u8 bg_layer1_flag;
+            u8 bg_layer2_flag;
+            u8 bg_layer3_flag;
+            u8 bg_layer4_flag;
+            s16 bg_layer3_width;
+            s16 bg_layer3_height;
+            s16 bg_layer4_width;
+            s16 bg_layer4_height;
+            u8 unknown[24];
+            Exit doors[12];// 24 * 12 bytes
+            Trigger triggers[12];// 16 * 12 bytes
+            // Only in occidental/international version
+            u8 display_arrow[12];
+            Arrow arrows[12];// 16 * 12 bytes
+        };
+        
+        // TODO: Fails!
+       // static_assert( sizeof(TriggerData) != 740, "Wrong size, check type defines and alignment");
+
+        TriggerData mData;
+    };
+    
+    class TriggerFileSerializer : public Serializer
+    {
+    public:
+        TriggerFileSerializer();
+        void importTriggerFile(Ogre::DataStreamPtr &stream, TriggersFile *pDest);
+    };
+
+    typedef Ogre::SharedPtr<TriggersFile> TriggersFilePtr;
+}

+ 1 - 0
QGearsMain/src/common/TypeDefine.cpp

@@ -39,6 +39,7 @@ namespace QGears
     const String    EXT_TEX     ( ".tex"        );
     const String    EXT_TIM     ( ".tim"        );
 
+    const String    EXT_TRIGGERS     (".triggers");
     const String    EXT_BACKGROUND   ( ".background" );
     const String    EXT_CAMERA_MATRIX( ".cam_matrix" );
     const String    EXT_MODEL_LIST   ( ".model_list" );

+ 11 - 0
QGearsMain/src/data/QGearsFLevelFile.cpp

@@ -162,6 +162,7 @@ namespace QGears
         m_model_list.setNull();
         m_walkmesh.setNull();
         m_hrc_files.clear();
+        m_triggers.setNull();
     }
 
     //--------------------------------------------------------------------------
@@ -252,6 +253,11 @@ namespace QGears
         return m_walkmesh;
     }
 
+    const TriggersFilePtr& FLevelFile::getTriggers() const
+    {
+        return m_triggers;
+    }
+
     //--------------------------------------------------------------------------
     void
     FLevelFile::setWalkmesh( const WalkmeshFilePtr &walkmesh )
@@ -259,6 +265,11 @@ namespace QGears
         m_walkmesh = walkmesh;
     }
 
+    void FLevelFile::setTriggers(const TriggersFilePtr& triggers)
+    {
+        m_triggers = triggers;
+    }
+
     //--------------------------------------------------------------------------
     String
     FLevelFile::getBackgroundTextureName( void ) const

+ 24 - 0
QGearsMain/src/data/QGearsFLevelFileSerializer.cpp

@@ -41,6 +41,7 @@ THE SOFTWARE.
 #include "data/QGearsPaletteFileSerializer.h"
 #include "map/QGearsWalkmeshFileManager.h"
 #include "map/FF7WalkmeshFileSerializer.h"
+#include "data/QGearsTriggersFile.h"
 
 namespace QGears
 {
@@ -206,6 +207,18 @@ namespace QGears
             case SECTION_BACKGROUND:
                 readBackground( stream, pDest );
                 break;
+
+            case SECTION_TILE_MAP:
+                // TODO
+                break;
+
+            case SECTION_ENCOUNTER:
+                // TODO
+                break;
+
+            case SECTION_TRIGGER:
+                readTriggers(stream, pDest);
+                break;
         }
     }
 
@@ -285,6 +298,17 @@ namespace QGears
         pDest->setBackground( background );
     }
 
+    void FLevelFileSerializer::readTriggers(Ogre::DataStreamPtr &stream, FLevelFile* pDest)
+    {
+        TriggersFilePtr triggers = createResource<TriggersFileManager>(pDest, EXT_TRIGGERS).staticCast<TriggersFile>();
+
+        TriggerFileSerializer ser;
+        ser.importTriggerFile(stream, triggers.getPointer());
+
+        pDest->setTriggers(triggers);
+    }
+
+
     //--------------------------------------------------------------------------
     String
     FLevelFileSerializer::getBaseName( const FLevelFile *pDest ) const

+ 95 - 0
QGearsMain/src/data/QGearsTriggersFile.cpp

@@ -0,0 +1,95 @@
+#include "data/QGearsTriggersFile.h"
+
+template<> QGears::TriggersFileManager *Ogre::Singleton<QGears::TriggersFileManager>::msSingleton = nullptr;
+
+namespace QGears
+{
+    TriggersFileManager::TriggersFileManager()
+    {
+        mResourceType = TriggersFile::RESOURCE_TYPE;
+
+        // low, because it will likely reference other resources
+        mLoadOrder = 30.0f;
+
+        // this is how we register the ResourceManager with OGRE
+        Ogre::ResourceGroupManager::getSingleton()._registerResourceManager(mResourceType, this);
+    }
+
+    TriggersFileManager::~TriggersFileManager()
+    {
+        Ogre::ResourceGroupManager::getSingleton()._unregisterResourceManager(mResourceType);
+    }
+
+    /*static*/ TriggersFileManager& TriggersFileManager::getSingleton()
+    {
+        assert(msSingleton);
+        return(*msSingleton);
+    }
+
+    /*static*/ TriggersFileManager* TriggersFileManager::getSingletonPtr()
+    {
+        return msSingleton;
+    }
+
+    // ===========================================================================
+
+    TriggersFile::TriggersFile(Ogre::ResourceManager* creator,
+        const String &name,
+        Ogre::ResourceHandle handle,
+        const String& group,
+        bool isManual,
+        Ogre::ManualResourceLoader* loader)
+        : Resource(creator, name, handle, group, isManual, loader)
+    {
+        // TODO
+    }
+
+    TriggersFile::~TriggersFile()
+    {
+        // TODO
+    }
+ 
+    void TriggersFile::loadImpl(void)
+    {
+        // TODO
+    }
+
+    void TriggersFile::unloadImpl(void)
+    {
+        // TODO
+    }
+
+    size_t TriggersFile::calculateSize(void) const
+    {
+        // TODO
+        return 0;
+    }
+
+    // TODO: Set this
+    /*static*/ const String TriggersFile::RESOURCE_TYPE;
+
+    // ===========================================================================
+
+    Ogre::Resource* TriggersFileManager::createImpl(
+        const Ogre::String &name,
+        Ogre::ResourceHandle handle,
+        const Ogre::String& group,
+        bool isManual,
+        Ogre::ManualResourceLoader* loader,
+        const Ogre::NameValuePairList* createParams)
+    {
+        return new TriggersFile(this, name, handle, group, isManual, loader);
+    }
+
+
+    TriggerFileSerializer::TriggerFileSerializer()
+    {
+        // TODO
+    }
+
+    void TriggerFileSerializer::importTriggerFile(Ogre::DataStreamPtr &stream, TriggersFile *pDest)
+    {
+        // TODO
+    }
+
+}