CDrawRoadsOperation.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. template <typename T> 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;
  25. std::pair<int, int> riverMapping;
  26. bool hasHFlip;
  27. bool hasVFlip;
  28. };
  29. struct ValidationResult
  30. {
  31. ValidationResult(bool result): result(result), flip(0){};
  32. bool result;
  33. int flip;
  34. };
  35. CDrawLinesOperation(CMap * map, CTerrainSelection terrainSel, T lineType, vstd::RNG * gen);
  36. virtual void executeTile(TerrainTile & tile, T type) = 0;
  37. virtual bool canApplyPattern(const LinePattern & pattern) const = 0;
  38. virtual bool needUpdateTile(const TerrainTile & tile) const = 0;
  39. virtual bool tileHasSomething(const int3 & pos) const = 0;
  40. virtual void updateTile(TerrainTile & tile, const LinePattern & pattern, const int flip) = 0;
  41. virtual T getIdentifier(TerrainTile & tile) const = 0;
  42. static const std::vector<LinePattern> patterns;
  43. void flipPattern(LinePattern & pattern, int flip) const;
  44. void updateTiles(std::set<int3> & invalidated);
  45. ValidationResult validateTile(const LinePattern & pattern, const int3 & pos);
  46. CTerrainSelection terrainSel;
  47. T lineType;
  48. vstd::RNG * gen;
  49. std::map<T, CTerrainSelection> formerState;
  50. private:
  51. void drawLines(CTerrainSelection selection, T type);
  52. };
  53. class CDrawRoadsOperation : public CDrawLinesOperation<RoadId>
  54. {
  55. public:
  56. CDrawRoadsOperation(CMap * map, const CTerrainSelection & terrainSel, RoadId roadType, vstd::RNG * gen);
  57. std::string getLabel() const override;
  58. protected:
  59. void executeTile(TerrainTile & tile, RoadId type) override;
  60. bool canApplyPattern(const LinePattern & pattern) const override;
  61. bool needUpdateTile(const TerrainTile & tile) const override;
  62. bool tileHasSomething(const int3 & pos) const override;
  63. void updateTile(TerrainTile & tile, const LinePattern & pattern, const int flip) override;
  64. RoadId getIdentifier(TerrainTile & tile) const override;
  65. private:
  66. RoadId roadType;
  67. };
  68. class CDrawRiversOperation : public CDrawLinesOperation<RiverId>
  69. {
  70. public:
  71. CDrawRiversOperation(CMap * map, const CTerrainSelection & terrainSel, RiverId roadType, vstd::RNG * gen);
  72. std::string getLabel() const override;
  73. protected:
  74. void executeTile(TerrainTile & tile, RiverId type) override;
  75. bool canApplyPattern(const LinePattern & pattern) const override;
  76. bool needUpdateTile(const TerrainTile & tile) const override;
  77. bool tileHasSomething(const int3 & pos) const override;
  78. void updateTile(TerrainTile & tile, const LinePattern & pattern, const int flip) override;
  79. RiverId getIdentifier(TerrainTile & tile) const override;
  80. private:
  81. RiverId riverType;
  82. };
  83. VCMI_LIB_NAMESPACE_END