QGearsTriggersFile.h 4.5 KB

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