QGearsTriggersFile.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #pragma once
  2. #include <OgreResourceManager.h>
  3. #include "QGearsPrerequisites.h"
  4. #include "common/QGearsResource.h"
  5. #include "QGearsSerializer.h"
  6. #include <memory>
  7. namespace QGears
  8. {
  9. class TriggersFileManager :
  10. public Ogre::ResourceManager,
  11. public Ogre::Singleton<TriggersFileManager>
  12. {
  13. public:
  14. TriggersFileManager();
  15. virtual ~TriggersFileManager();
  16. static TriggersFileManager& getSingleton();
  17. static TriggersFileManager* getSingletonPtr();
  18. protected:
  19. virtual Ogre::Resource *createImpl(
  20. const Ogre::String &name,
  21. Ogre::ResourceHandle handle,
  22. const Ogre::String& group,
  23. bool isManual,
  24. Ogre::ManualResourceLoader* loader,
  25. const Ogre::NameValuePairList* createParams) override;
  26. };
  27. class TriggersFile : public Resource
  28. {
  29. public:
  30. TriggersFile(Ogre::ResourceManager* creator,
  31. const String &name,
  32. Ogre::ResourceHandle handle,
  33. const String& group,
  34. bool isManual = false,
  35. Ogre::ManualResourceLoader* loader = nullptr);
  36. virtual ~TriggersFile();
  37. static const String RESOURCE_TYPE;
  38. struct Range
  39. {
  40. s16 left;
  41. s16 top;
  42. s16 right;
  43. s16 bottom;
  44. };
  45. const Range& getCameraRange() const
  46. {
  47. return mData->camera_range;
  48. }
  49. protected:
  50. virtual void loadImpl(void) override;
  51. virtual void unloadImpl(void) override;
  52. virtual size_t calculateSize(void) const override;
  53. private:
  54. struct Vertex_s
  55. {
  56. u16 x;
  57. u16 y;
  58. u16 z;
  59. };
  60. struct Exit
  61. {
  62. std::array<Vertex_s, 2> exit_line;
  63. Vertex_s destination;
  64. u16 fieldID;
  65. u8 dir, dir_copy1, dir_copy2, dir_copy3;
  66. };
  67. struct Trigger
  68. {
  69. std::array<Vertex_s, 2> trigger_line;
  70. u8 background_parameter;
  71. u8 background_state;
  72. u8 behavior;
  73. /* 0 - OnTrigger - ON
  74. * 1 - OnTrigger - OFF
  75. * 2 - OnTrigger - ON, AwayFromTrigger - OFF
  76. * 3 - OnTrigger - OFF, AwayFromTrigger - ON
  77. * 4 - OnTrigger - ON, AwayFromTriggerOnPlusSide - OFF
  78. * 5 - OnTrigger - OFF, AwayFromTriggerOnPlusSide - ON
  79. */
  80. u8 soundID;
  81. };
  82. struct Arrow
  83. {
  84. s32 positionX;
  85. s32 positionZ;
  86. s32 positionY;
  87. u32 type;// 0 - Invisible, 1 - Red, 2 - Green
  88. };
  89. struct TriggerData
  90. {
  91. std::array<char,9> name;
  92. u8 control;
  93. s16 cameraFocusHeight;
  94. Range camera_range; // 8 bytes
  95. u8 bg_layer1_flag;
  96. u8 bg_layer2_flag;
  97. u8 bg_layer3_flag;
  98. u8 bg_layer4_flag;
  99. s16 bg_layer3_width;
  100. s16 bg_layer3_height;
  101. s16 bg_layer4_width;
  102. s16 bg_layer4_height;
  103. std::array<u8,24> unknown;
  104. std::array<Exit,12> doors;// 24 * 12 bytes
  105. std::array<Trigger, 12> triggers;// 16 * 12 bytes
  106. // Only in occidental/international version
  107. std::array<u8,12> display_arrow;
  108. std::array<Arrow,12> arrows;// 16 * 12 bytes
  109. };
  110. std::unique_ptr<TriggerData> mData;
  111. friend class TriggerFileSerializer;
  112. };
  113. class TriggerFileSerializer : public Serializer
  114. {
  115. public:
  116. TriggerFileSerializer();
  117. void importTriggerFile(Ogre::DataStreamPtr &stream, TriggersFile *pDest);
  118. private:
  119. void ReadVertex_s(Ogre::DataStreamPtr& stream, TriggersFile::Vertex_s& vertex);
  120. void ReadRange(Ogre::DataStreamPtr& stream, TriggersFile::Range& range);
  121. void ReadExit(Ogre::DataStreamPtr& stream, TriggersFile::Exit& exit);
  122. void ReadArrow(Ogre::DataStreamPtr& stream, TriggersFile::Arrow& arrow);
  123. void ReadTrigger(Ogre::DataStreamPtr& stream, TriggersFile::Trigger& trigger);
  124. };
  125. typedef Ogre::SharedPtr<TriggersFile> TriggersFilePtr;
  126. }