CDrawRoadsOperation.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * CDrawRoadsOperation.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "../CRandomGenerator.h"
  12. #include "CMapEditManager.h"
  13. VCMI_LIB_NAMESPACE_BEGIN
  14. struct TerrainTile;
  15. class CDrawLinesOperation : public CMapOperation
  16. {
  17. public:
  18. void execute() override;
  19. void undo() override;
  20. void redo() override;
  21. protected:
  22. struct LinePattern
  23. {
  24. std::string data[9];
  25. std::pair<int, int> roadMapping, riverMapping;
  26. bool hasHFlip, hasVFlip;
  27. };
  28. struct ValidationResult
  29. {
  30. ValidationResult(bool result): result(result), flip(0){};
  31. bool result;
  32. int flip;
  33. };
  34. CDrawLinesOperation(CMap * map, const CTerrainSelection & terrainSel, CRandomGenerator * gen);
  35. virtual void executeTile(TerrainTile & tile) = 0;
  36. virtual bool canApplyPattern(const CDrawLinesOperation::LinePattern & pattern) const = 0;
  37. virtual bool needUpdateTile(const TerrainTile & tile) const = 0;
  38. virtual bool tileHasSomething(const int3 & pos) const = 0;
  39. virtual void updateTile(TerrainTile & tile, const CDrawLinesOperation::LinePattern & pattern, const int flip) = 0;
  40. static const std::vector<LinePattern> patterns;
  41. void flipPattern(LinePattern & pattern, int flip) const;
  42. void updateTiles(std::set<int3> & invalidated);
  43. ValidationResult validateTile(const LinePattern & pattern, const int3 & pos);
  44. CTerrainSelection terrainSel;
  45. CRandomGenerator * gen;
  46. };
  47. class CDrawRoadsOperation : public CDrawLinesOperation
  48. {
  49. public:
  50. CDrawRoadsOperation(CMap * map, const CTerrainSelection & terrainSel, RoadId roadType, CRandomGenerator * gen);
  51. std::string getLabel() const override;
  52. protected:
  53. void executeTile(TerrainTile & tile) override;
  54. bool canApplyPattern(const CDrawLinesOperation::LinePattern & pattern) const override;
  55. bool needUpdateTile(const TerrainTile & tile) const override;
  56. bool tileHasSomething(const int3 & pos) const override;
  57. void updateTile(TerrainTile & tile, const CDrawLinesOperation::LinePattern & pattern, const int flip) override;
  58. private:
  59. RoadId roadType;
  60. };
  61. class CDrawRiversOperation : public CDrawLinesOperation
  62. {
  63. public:
  64. CDrawRiversOperation(CMap * map, const CTerrainSelection & terrainSel, RiverId roadType, CRandomGenerator * gen);
  65. std::string getLabel() const override;
  66. protected:
  67. void executeTile(TerrainTile & tile) override;
  68. bool canApplyPattern(const CDrawLinesOperation::LinePattern & pattern) const override;
  69. bool needUpdateTile(const TerrainTile & tile) const override;
  70. bool tileHasSomething(const int3 & pos) const override;
  71. void updateTile(TerrainTile & tile, const CDrawLinesOperation::LinePattern & pattern, const int flip) override;
  72. private:
  73. RiverId riverType;
  74. };
  75. VCMI_LIB_NAMESPACE_END