map_data.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #pragma once
  2. #include <QJsonArray>
  3. #include <QJsonObject>
  4. #include <QObject>
  5. #include <QString>
  6. #include <QVector2D>
  7. #include <QVector>
  8. #include <memory>
  9. #include <variant>
  10. #include <vector>
  11. namespace MapEditor {
  12. struct TerrainElement {
  13. QString type;
  14. float x = 0.0F;
  15. float z = 0.0F;
  16. float radius = 10.0F;
  17. float width = 10.0F;
  18. float depth = 10.0F;
  19. float height = 3.0F;
  20. float rotation = 0.0F;
  21. QJsonArray entrances;
  22. QJsonObject extraFields;
  23. };
  24. struct FirecampElement {
  25. float x = 0.0F;
  26. float z = 0.0F;
  27. float intensity = 1.0F;
  28. float radius = 3.0F;
  29. QJsonObject extraFields;
  30. };
  31. struct LinearElement {
  32. QString type;
  33. QVector2D start;
  34. QVector2D end;
  35. float width = 3.0F;
  36. float height = 0.5F;
  37. QString style;
  38. QJsonObject extraFields;
  39. };
  40. struct StructureElement {
  41. QString type;
  42. float x = 0.0F;
  43. float z = 0.0F;
  44. int playerId = 0;
  45. int maxPopulation = 150;
  46. QString nation;
  47. QJsonObject extraFields;
  48. };
  49. struct GridSettings {
  50. int width = 100;
  51. int height = 100;
  52. float tileSize = 1.0F;
  53. };
  54. class MapData;
  55. class Command {
  56. public:
  57. virtual ~Command() = default;
  58. virtual void execute() = 0;
  59. virtual void undo() = 0;
  60. };
  61. class MapData : public QObject {
  62. Q_OBJECT
  63. public:
  64. explicit MapData(QObject *parent = nullptr);
  65. bool loadFromJson(const QString &filePath);
  66. bool saveToJson(const QString &filePath) const;
  67. [[nodiscard]] QString name() const { return m_name; }
  68. void setName(const QString &name);
  69. [[nodiscard]] const GridSettings &grid() const { return m_grid; }
  70. void setGrid(const GridSettings &grid);
  71. [[nodiscard]] const QVector<TerrainElement> &terrainElements() const {
  72. return m_terrain;
  73. }
  74. void addTerrainElement(const TerrainElement &element);
  75. void updateTerrainElement(int index, const TerrainElement &element);
  76. void removeTerrainElement(int index);
  77. [[nodiscard]] const QVector<FirecampElement> &firecamps() const {
  78. return m_firecamps;
  79. }
  80. void addFirecamp(const FirecampElement &element);
  81. void updateFirecamp(int index, const FirecampElement &element);
  82. void removeFirecamp(int index);
  83. [[nodiscard]] const QVector<LinearElement> &linearElements() const {
  84. return m_linearElements;
  85. }
  86. void addLinearElement(const LinearElement &element);
  87. void updateLinearElement(int index, const LinearElement &element);
  88. void removeLinearElement(int index);
  89. [[nodiscard]] const QVector<StructureElement> &structures() const {
  90. return m_structures;
  91. }
  92. void addStructure(const StructureElement &element);
  93. void updateStructure(int index, const StructureElement &element);
  94. void removeStructure(int index);
  95. void executeCommand(std::unique_ptr<Command> cmd);
  96. void undo();
  97. void redo();
  98. [[nodiscard]] bool canUndo() const { return !m_undoStack.empty(); }
  99. [[nodiscard]] bool canRedo() const { return !m_redoStack.empty(); }
  100. void clear();
  101. [[nodiscard]] bool isModified() const { return m_modified; }
  102. void setModified(bool modified);
  103. signals:
  104. void dataChanged();
  105. void modifiedChanged(bool modified);
  106. void undoRedoChanged();
  107. private:
  108. QString m_name;
  109. GridSettings m_grid;
  110. QVector<TerrainElement> m_terrain;
  111. QVector<FirecampElement> m_firecamps;
  112. QVector<LinearElement> m_linearElements;
  113. QVector<StructureElement> m_structures;
  114. QJsonObject m_biome;
  115. QJsonObject m_camera;
  116. QJsonArray m_spawns;
  117. QJsonObject m_victory;
  118. QJsonObject m_rain;
  119. QString m_description;
  120. QString m_coordSystem;
  121. int m_maxTroopsPerPlayer = 2000;
  122. bool m_modified = false;
  123. std::vector<std::unique_ptr<Command>> m_undoStack;
  124. std::vector<std::unique_ptr<Command>> m_redoStack;
  125. void parseTerrainArray(const QJsonArray &arr);
  126. void parseFirecampsArray(const QJsonArray &arr);
  127. void parseRiversArray(const QJsonArray &arr);
  128. void parseRoadsArray(const QJsonArray &arr);
  129. void parseBridgesArray(const QJsonArray &arr);
  130. void parseStructuresFromSpawns(const QJsonArray &arr);
  131. [[nodiscard]] QJsonArray terrainToJson() const;
  132. [[nodiscard]] QJsonArray firecampsToJson() const;
  133. [[nodiscard]] QJsonArray riversToJson() const;
  134. [[nodiscard]] QJsonArray roadsToJson() const;
  135. [[nodiscard]] QJsonArray bridgesToJson() const;
  136. [[nodiscard]] QJsonArray structuresToSpawnsJson() const;
  137. };
  138. } // namespace MapEditor