QGearsTriggersFile.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. const Range& getCameraRange() const
  47. {
  48. return mData->camera_range;
  49. }
  50. float MovementRotation() const
  51. {
  52. // This is the angle in which the player moves when "up" is pressed
  53. return 180.0f * (static_cast<float>(mData->control) - 128.0f) / 128.0f;
  54. }
  55. protected:
  56. virtual void loadImpl(void) override;
  57. virtual void unloadImpl(void) override;
  58. virtual size_t calculateSize(void) const override;
  59. private:
  60. struct Vertex_s
  61. {
  62. u16 x;
  63. u16 y;
  64. u16 z;
  65. };
  66. struct Exit
  67. {
  68. std::array<Vertex_s, 2> exit_line;
  69. Vertex_s destination;
  70. u16 fieldID;
  71. u8 dir, dir_copy1, dir_copy2, dir_copy3;
  72. };
  73. struct Trigger
  74. {
  75. std::array<Vertex_s, 2> trigger_line;
  76. u8 background_parameter;
  77. u8 background_state;
  78. u8 behavior;
  79. /* 0 - OnTrigger - ON
  80. * 1 - OnTrigger - OFF
  81. * 2 - OnTrigger - ON, AwayFromTrigger - OFF
  82. * 3 - OnTrigger - OFF, AwayFromTrigger - ON
  83. * 4 - OnTrigger - ON, AwayFromTriggerOnPlusSide - OFF
  84. * 5 - OnTrigger - OFF, AwayFromTriggerOnPlusSide - ON
  85. */
  86. u8 soundID;
  87. };
  88. struct Arrow
  89. {
  90. s32 positionX;
  91. s32 positionZ;
  92. s32 positionY;
  93. u32 type;// 0 - Invisible, 1 - Red, 2 - Green
  94. };
  95. struct TriggerData
  96. {
  97. std::array<char,9> name;
  98. u8 control;
  99. s16 cameraFocusHeight;
  100. Range camera_range; // 8 bytes
  101. u8 bg_layer1_flag;
  102. u8 bg_layer2_flag;
  103. u8 bg_layer3_flag;
  104. u8 bg_layer4_flag;
  105. s16 bg_layer3_width;
  106. s16 bg_layer3_height;
  107. s16 bg_layer4_width;
  108. s16 bg_layer4_height;
  109. std::array<u8,24> unknown;
  110. std::array<Exit,12> doors;// 24 * 12 bytes
  111. std::array<Trigger, 12> triggers;// 16 * 12 bytes
  112. // Only in occidental/international version
  113. std::array<u8,12> display_arrow;
  114. std::array<Arrow,12> arrows;// 16 * 12 bytes
  115. };
  116. std::unique_ptr<TriggerData> mData;
  117. friend class TriggerFileSerializer;
  118. };
  119. class TriggerFileSerializer : public Serializer
  120. {
  121. public:
  122. TriggerFileSerializer();
  123. void importTriggerFile(Ogre::DataStreamPtr &stream, TriggersFile *pDest);
  124. private:
  125. void ReadVertex_s(Ogre::DataStreamPtr& stream, TriggersFile::Vertex_s& vertex);
  126. void ReadRange(Ogre::DataStreamPtr& stream, TriggersFile::Range& range);
  127. void ReadExit(Ogre::DataStreamPtr& stream, TriggersFile::Exit& exit);
  128. void ReadArrow(Ogre::DataStreamPtr& stream, TriggersFile::Arrow& arrow);
  129. void ReadTrigger(Ogre::DataStreamPtr& stream, TriggersFile::Trigger& trigger);
  130. };
  131. typedef Ogre::SharedPtr<TriggersFile> TriggersFilePtr;
  132. }