QGearsTriggersFile.h 4.1 KB

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