QGearsTriggersFile.h 4.1 KB

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