CDrawRoadsOperation.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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;
  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, vstd::RNG * gen);
  36. virtual void executeTile(TerrainTile & tile) = 0;
  37. virtual bool canApplyPattern(const CDrawLinesOperation::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 CDrawLinesOperation::LinePattern & pattern, const int flip) = 0;
  41. static const std::vector<LinePattern> patterns;
  42. void flipPattern(LinePattern & pattern, int flip) const;
  43. void updateTiles(std::set<int3> & invalidated);
  44. ValidationResult validateTile(const LinePattern & pattern, const int3 & pos);
  45. CTerrainSelection terrainSel;
  46. vstd::RNG * gen;
  47. };
  48. class CDrawRoadsOperation : public CDrawLinesOperation
  49. {
  50. public:
  51. CDrawRoadsOperation(CMap * map, const CTerrainSelection & terrainSel, RoadId roadType, vstd::RNG * gen);
  52. std::string getLabel() const override;
  53. protected:
  54. void executeTile(TerrainTile & tile) override;
  55. bool canApplyPattern(const CDrawLinesOperation::LinePattern & pattern) const override;
  56. bool needUpdateTile(const TerrainTile & tile) const override;
  57. bool tileHasSomething(const int3 & pos) const override;
  58. void updateTile(TerrainTile & tile, const CDrawLinesOperation::LinePattern & pattern, const int flip) override;
  59. private:
  60. RoadId roadType;
  61. };
  62. class CDrawRiversOperation : public CDrawLinesOperation
  63. {
  64. public:
  65. CDrawRiversOperation(CMap * map, const CTerrainSelection & terrainSel, RiverId roadType, vstd::RNG * gen);
  66. std::string getLabel() const override;
  67. protected:
  68. void executeTile(TerrainTile & tile) override;
  69. bool canApplyPattern(const CDrawLinesOperation::LinePattern & pattern) const override;
  70. bool needUpdateTile(const TerrainTile & tile) const override;
  71. bool tileHasSomething(const int3 & pos) const override;
  72. void updateTile(TerrainTile & tile, const CDrawLinesOperation::LinePattern & pattern, const int flip) override;
  73. private:
  74. RiverId riverType;
  75. };
  76. VCMI_LIB_NAMESPACE_END