CDrawRoadsOperation.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 "CMapOperation.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. struct TerrainTile;
  14. class CDrawLinesOperation : public CMapOperation
  15. {
  16. public:
  17. void execute() override;
  18. void undo() override;
  19. void redo() override;
  20. protected:
  21. struct LinePattern
  22. {
  23. std::string data[9];
  24. std::pair<int, int> roadMapping, riverMapping;
  25. bool hasHFlip, hasVFlip;
  26. };
  27. struct ValidationResult
  28. {
  29. ValidationResult(bool result): result(result), flip(0){};
  30. bool result;
  31. int flip;
  32. };
  33. CDrawLinesOperation(CMap * map, CTerrainSelection terrainSel, CRandomGenerator * gen);
  34. virtual void executeTile(TerrainTile & tile) = 0;
  35. virtual bool canApplyPattern(const CDrawLinesOperation::LinePattern & pattern) const = 0;
  36. virtual bool needUpdateTile(const TerrainTile & tile) const = 0;
  37. virtual bool tileHasSomething(const int3 & pos) const = 0;
  38. virtual void updateTile(TerrainTile & tile, const CDrawLinesOperation::LinePattern & pattern, const int flip) = 0;
  39. static const std::vector<LinePattern> patterns;
  40. void flipPattern(LinePattern & pattern, int flip) const;
  41. void updateTiles(std::set<int3> & invalidated);
  42. ValidationResult validateTile(const LinePattern & pattern, const int3 & pos);
  43. CTerrainSelection terrainSel;
  44. CRandomGenerator * gen;
  45. };
  46. class CDrawRoadsOperation : public CDrawLinesOperation
  47. {
  48. public:
  49. CDrawRoadsOperation(CMap * map, const CTerrainSelection & terrainSel, RoadId roadType, CRandomGenerator * gen);
  50. std::string getLabel() const override;
  51. protected:
  52. void executeTile(TerrainTile & tile) override;
  53. bool canApplyPattern(const CDrawLinesOperation::LinePattern & pattern) const override;
  54. bool needUpdateTile(const TerrainTile & tile) const override;
  55. bool tileHasSomething(const int3 & pos) const override;
  56. void updateTile(TerrainTile & tile, const CDrawLinesOperation::LinePattern & pattern, const int flip) override;
  57. private:
  58. RoadId roadType;
  59. };
  60. class CDrawRiversOperation : public CDrawLinesOperation
  61. {
  62. public:
  63. CDrawRiversOperation(CMap * map, const CTerrainSelection & terrainSel, RiverId roadType, CRandomGenerator * gen);
  64. std::string getLabel() const override;
  65. protected:
  66. void executeTile(TerrainTile & tile) override;
  67. bool canApplyPattern(const CDrawLinesOperation::LinePattern & pattern) const override;
  68. bool needUpdateTile(const TerrainTile & tile) const override;
  69. bool tileHasSomething(const int3 & pos) const override;
  70. void updateTile(TerrainTile & tile, const CDrawLinesOperation::LinePattern & pattern, const int flip) override;
  71. private:
  72. RiverId riverType;
  73. };
  74. VCMI_LIB_NAMESPACE_END