Selaa lähdekoodia

impl read triggers data

Paul 11 vuotta sitten
vanhempi
sitoutus
de51f46eee

+ 2 - 0
QGearsMain/include/data/QGearsSerializer.h

@@ -52,6 +52,7 @@ namespace QGears
         void    readObject( Ogre::DataStreamPtr &stream, Ogre::AxisAlignedBox &pDest );
         void    readObject( Ogre::DataStreamPtr &stream, Ogre::AxisAlignedBox &pDest );
         void    readObject( Ogre::DataStreamPtr &stream, Pixel &pDest );
         void    readObject( Ogre::DataStreamPtr &stream, Pixel &pDest );
 
 
+        void readChars(Ogre::DataStreamPtr& stream, char* pDest, size_t count);
         void    read1ByteBool( Ogre::DataStreamPtr &stream, bool &pDest );
         void    read1ByteBool( Ogre::DataStreamPtr &stream, bool &pDest );
         void    read2ByteBool( Ogre::DataStreamPtr &stream, bool &pDest );
         void    read2ByteBool( Ogre::DataStreamPtr &stream, bool &pDest );
         void    readShort( Ogre::DataStreamPtr &stream, uint16 &pDest );
         void    readShort( Ogre::DataStreamPtr &stream, uint16 &pDest );
@@ -60,6 +61,7 @@ namespace QGears
         void    readInt16( Ogre::DataStreamPtr &stream, sint16 &pDest );
         void    readInt16( Ogre::DataStreamPtr &stream, sint16 &pDest );
         void    readUInt16( Ogre::DataStreamPtr &stream, uint16 &pDest );
         void    readUInt16( Ogre::DataStreamPtr &stream, uint16 &pDest );
         void    readUInt32( Ogre::DataStreamPtr &stream, uint32 &pDest );
         void    readUInt32( Ogre::DataStreamPtr &stream, uint32 &pDest );
+        void    readSInt32(Ogre::DataStreamPtr &stream, sint32 &pDest);
         void    readUInt32( Ogre::DataStream &stream, uint32 &pDest );
         void    readUInt32( Ogre::DataStream &stream, uint32 &pDest );
         void    readUInt8( Ogre::DataStream& stream, uint8 &pDest );
         void    readUInt8( Ogre::DataStream& stream, uint8 &pDest );
         void    readUInt8(Ogre::DataStreamPtr &stream, uint8 &pDest );
         void    readUInt8(Ogre::DataStreamPtr &stream, uint8 &pDest );

+ 17 - 11
QGearsMain/include/data/QGearsTriggersFile.h

@@ -59,7 +59,7 @@ namespace QGears
 
 
         struct Exit
         struct Exit
         {
         {
-            Vertex_s exit_line[2];
+            std::array<Vertex_s, 2> exit_line;
             Vertex_s destination;
             Vertex_s destination;
             u16 fieldID;
             u16 fieldID;
             u8 dir, dir_copy1, dir_copy2, dir_copy3;
             u8 dir, dir_copy1, dir_copy2, dir_copy3;
@@ -67,7 +67,7 @@ namespace QGears
 
 
         struct Trigger
         struct Trigger
         {
         {
-            Vertex_s trigger_line[2];
+            std::array<Vertex_s, 2> trigger_line;
             u8 background_parameter;
             u8 background_parameter;
             u8 background_state;
             u8 background_state;
             u8 behavior;
             u8 behavior;
@@ -91,7 +91,7 @@ namespace QGears
 
 
         struct TriggerData
         struct TriggerData
         {
         {
-            char name[9];
+            std::array<char,9> name;
             u8 control;
             u8 control;
             s16 cameraFocusHeight;
             s16 cameraFocusHeight;
             Range camera_range; // 8 bytes
             Range camera_range; // 8 bytes
@@ -103,18 +103,18 @@ namespace QGears
             s16 bg_layer3_height;
             s16 bg_layer3_height;
             s16 bg_layer4_width;
             s16 bg_layer4_width;
             s16 bg_layer4_height;
             s16 bg_layer4_height;
-            u8 unknown[24];
-            Exit doors[12];// 24 * 12 bytes
-            Trigger triggers[12];// 16 * 12 bytes
+            std::array<u8,24> unknown;
+            std::array<Exit,12> doors;// 24 * 12 bytes
+            std::array<Trigger, 12> triggers;// 16 * 12 bytes
             // Only in occidental/international version
             // Only in occidental/international version
-            u8 display_arrow[12];
-            Arrow arrows[12];// 16 * 12 bytes
+            std::array<u8,12> display_arrow;
+            std::array<Arrow,12> arrows;// 16 * 12 bytes
         };
         };
         
         
-        // TODO: Fails!
-       // static_assert( sizeof(TriggerData) != 740, "Wrong size, check type defines and alignment");
 
 
-        TriggerData mData;
+        std::unique_ptr<TriggerData> mData;
+
+        friend class TriggerFileSerializer;
     };
     };
     
     
     class TriggerFileSerializer : public Serializer
     class TriggerFileSerializer : public Serializer
@@ -122,6 +122,12 @@ namespace QGears
     public:
     public:
         TriggerFileSerializer();
         TriggerFileSerializer();
         void importTriggerFile(Ogre::DataStreamPtr &stream, TriggersFile *pDest);
         void importTriggerFile(Ogre::DataStreamPtr &stream, TriggersFile *pDest);
+    private:
+        void ReadVertex_s(Ogre::DataStreamPtr& stream, TriggersFile::Vertex_s& vertex);
+        void ReadRange(Ogre::DataStreamPtr& stream, TriggersFile::Range& range);
+        void ReadExit(Ogre::DataStreamPtr& stream, TriggersFile::Exit& exit);
+        void ReadArrow(Ogre::DataStreamPtr& stream, TriggersFile::Arrow& arrow);
+        void ReadTrigger(Ogre::DataStreamPtr& stream, TriggersFile::Trigger& trigger);
     };
     };
 
 
     typedef Ogre::SharedPtr<TriggersFile> TriggersFilePtr;
     typedef Ogre::SharedPtr<TriggersFile> TriggersFilePtr;

+ 2 - 0
QGearsMain/src/common/QGearsApplication.cpp

@@ -35,6 +35,7 @@ GNU General Public License for more details.
 #include "map/QGearsWalkmeshFileManager.h"
 #include "map/QGearsWalkmeshFileManager.h"
 #include "data/FF7ModelListFileManager.h"
 #include "data/FF7ModelListFileManager.h"
 #include "data/QGearsLGPArchiveFactory.h"
 #include "data/QGearsLGPArchiveFactory.h"
+#include "data/QGearsTriggersFile.h"
 #include "common/make_unique.h"
 #include "common/make_unique.h"
 #include "qgears_version.h"
 #include "qgears_version.h"
 
 
@@ -279,6 +280,7 @@ namespace QGears
         m_resource_managers.emplace_back( std::make_shared<QGears::LZSFLevelFileManager>() );
         m_resource_managers.emplace_back( std::make_shared<QGears::LZSFLevelFileManager>() );
         m_resource_managers.emplace_back( std::make_shared<QGears::BackgroundFileManager>() );
         m_resource_managers.emplace_back( std::make_shared<QGears::BackgroundFileManager>() );
         m_resource_managers.emplace_back( std::make_shared<QGears::Background2DFileManager>() );
         m_resource_managers.emplace_back( std::make_shared<QGears::Background2DFileManager>() );
+        m_resource_managers.emplace_back(std::make_shared<QGears::TriggersFileManager>());
     }
     }
 
 
     //--------------------------------------------------------------------------
     //--------------------------------------------------------------------------

+ 10 - 0
QGearsMain/src/data/QGearsSerializer.cpp

@@ -89,6 +89,11 @@ namespace QGears
         flipFromLittleEndian( &pDest, 2, 2 );
         flipFromLittleEndian( &pDest, 2, 2 );
     }
     }
 
 
+    void Serializer::readChars(Ogre::DataStreamPtr& stream, char* pDest, size_t count)
+    {
+        stream->read(pDest, count);
+    }
+
     //---------------------------------------------------------------------
     //---------------------------------------------------------------------
     void
     void
     Serializer::read1ByteBool( Ogre::DataStreamPtr &stream, bool &pDest )
     Serializer::read1ByteBool( Ogre::DataStreamPtr &stream, bool &pDest )
@@ -141,6 +146,11 @@ namespace QGears
         readInts( stream, &pDest, 1 );
         readInts( stream, &pDest, 1 );
     }
     }
 
 
+    void Serializer::readSInt32(Ogre::DataStreamPtr &stream, sint32 &pDest)
+    {
+        stream->read(&pDest, sizeof(sint32));
+    }
+
     void Serializer::readUInt32( Ogre::DataStream &stream, uint32 &pDest )
     void Serializer::readUInt32( Ogre::DataStream &stream, uint32 &pDest )
     {
     {
         stream.read(&pDest,sizeof(uint32));
         stream.read(&pDest,sizeof(uint32));

+ 100 - 10
QGearsMain/src/data/QGearsTriggersFile.cpp

@@ -41,32 +41,31 @@ namespace QGears
         Ogre::ManualResourceLoader* loader)
         Ogre::ManualResourceLoader* loader)
         : Resource(creator, name, handle, group, isManual, loader)
         : Resource(creator, name, handle, group, isManual, loader)
     {
     {
-        // TODO
     }
     }
 
 
     TriggersFile::~TriggersFile()
     TriggersFile::~TriggersFile()
     {
     {
-        // TODO
+        unload();
     }
     }
  
  
     void TriggersFile::loadImpl(void)
     void TriggersFile::loadImpl(void)
     {
     {
-        // TODO
+        TriggerFileSerializer serializer;
+        Ogre::DataStreamPtr stream(openResource());
+        serializer.importTriggerFile(stream, this);
     }
     }
 
 
     void TriggersFile::unloadImpl(void)
     void TriggersFile::unloadImpl(void)
     {
     {
-        // TODO
+
     }
     }
 
 
     size_t TriggersFile::calculateSize(void) const
     size_t TriggersFile::calculateSize(void) const
     {
     {
-        // TODO
-        return 0;
+        return sizeof(TriggerData);
     }
     }
 
 
-    // TODO: Set this
-    /*static*/ const String TriggersFile::RESOURCE_TYPE;
+    /*static*/ const String TriggersFile::RESOURCE_TYPE("FF7FieldTriggersSection");
 
 
     // ===========================================================================
     // ===========================================================================
 
 
@@ -84,12 +83,103 @@ namespace QGears
 
 
     TriggerFileSerializer::TriggerFileSerializer()
     TriggerFileSerializer::TriggerFileSerializer()
     {
     {
-        // TODO
+
+    }
+
+    void TriggerFileSerializer::ReadVertex_s(Ogre::DataStreamPtr& stream, TriggersFile::Vertex_s& vertex)
+    {
+        readShort(stream, vertex.x);
+        readShort(stream, vertex.y);
+        readShort(stream, vertex.z);
+    }
+
+    void TriggerFileSerializer::ReadRange(Ogre::DataStreamPtr& stream, TriggersFile::Range& range)
+    {
+        readInt16(stream, range.left);
+        readInt16(stream, range.top);
+        readInt16(stream, range.right);
+        readInt16(stream, range.bottom);
+    }
+
+    void TriggerFileSerializer::ReadExit(Ogre::DataStreamPtr& stream, TriggersFile::Exit& exit)
+    {
+        for (size_t i = 0; i < exit.exit_line.size(); i++)
+        {
+            ReadVertex_s(stream, exit.exit_line[i]);
+        }
+        ReadVertex_s(stream, exit.destination);
+        readShort(stream, exit.fieldID);
+        readUInt8(stream, exit.dir);
+        readUInt8(stream, exit.dir_copy1);
+        readUInt8(stream, exit.dir_copy2);
+        readUInt8(stream, exit.dir_copy3);
+    }
+
+    void TriggerFileSerializer::ReadArrow(Ogre::DataStreamPtr& stream, TriggersFile::Arrow& arrow)
+    {
+        readSInt32(stream, arrow.positionX);
+        readSInt32(stream, arrow.positionZ);
+        readSInt32(stream, arrow.positionY);
+        readUInt32(stream, arrow.type);
+    }
+
+    void TriggerFileSerializer::ReadTrigger(Ogre::DataStreamPtr& stream, TriggersFile::Trigger& trigger)
+    {
+        for (size_t i = 0; i < trigger.trigger_line.size(); i++)
+        {
+            ReadVertex_s(stream, trigger.trigger_line[i]);
+        }
+        readUInt8(stream, trigger.background_parameter);
+        readUInt8(stream, trigger.background_state);
+        readUInt8(stream, trigger.behavior);
+        readUInt8(stream, trigger.soundID);
     }
     }
 
 
     void TriggerFileSerializer::importTriggerFile(Ogre::DataStreamPtr &stream, TriggersFile *pDest)
     void TriggerFileSerializer::importTriggerFile(Ogre::DataStreamPtr &stream, TriggersFile *pDest)
     {
     {
-        // TODO
+        std::unique_ptr<TriggersFile::TriggerData> data = std::unique_ptr<TriggersFile::TriggerData>(new TriggersFile::TriggerData());
+
+        readChars(stream, data->name.data(), data->name.size());
+        readUInt8(stream, data->control);
+        readInt16(stream, data->cameraFocusHeight);
+        ReadRange(stream, data->camera_range);
+
+        readUInt8(stream, data->bg_layer1_flag);
+        readUInt8(stream, data->bg_layer2_flag);
+        readUInt8(stream, data->bg_layer3_flag);
+        readUInt8(stream, data->bg_layer4_flag);
+   
+        readInt16(stream, data->bg_layer3_width);
+        readInt16(stream, data->bg_layer3_height);
+        readInt16(stream, data->bg_layer4_width);
+        readInt16(stream, data->bg_layer4_height);
+
+        stream->read(data->unknown.data(), data->unknown.size());
+
+
+        for (size_t i = 0; i < data->doors.size(); i++)
+        {
+            TriggersFile::Exit& exit = data->doors[i];
+            ReadExit(stream, exit);
+        }
+        
+        for (size_t i = 0; i < data->triggers.size(); i++)
+        {
+            TriggersFile::Trigger& trigger = data->triggers[i];
+            ReadTrigger(stream, trigger);
+        }
+
+        stream->read(data->display_arrow.data(), data->display_arrow.size());
+
+        for (size_t i = 0; i < data->arrows.size(); i++)
+        {
+            TriggersFile::Arrow& arrow = data->arrows[i];
+            ReadArrow(stream, arrow);
+        }
+
+        pDest->mData = std::move(data);
+
+
     }
     }
 
 
 }
 }