QGearsTriggersFile.h 4.0 KB

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