1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00
vcmi/lib/mapping/CMapOperation.h
2022-09-06 18:47:41 +02:00

164 lines
4.3 KiB
C++

/*
* CMapOperation.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
#include "../int3.h"
#include "MapEditUtils.h"
class CGObjectInstance;
class CMap;
class CRandomGenerator;
/// The abstract base class CMapOperation defines an operation that can be executed, undone and redone.
class DLL_LINKAGE CMapOperation : public boost::noncopyable
{
public:
explicit CMapOperation(CMap* map);
virtual ~CMapOperation() { };
virtual void execute() = 0;
virtual void undo() = 0;
virtual void redo() = 0;
virtual std::string getLabel() const = 0; /// Returns a display-able name of the operation.
static const int FLIP_PATTERN_HORIZONTAL = 1;
static const int FLIP_PATTERN_VERTICAL = 2;
static const int FLIP_PATTERN_BOTH = 3;
protected:
MapRect extendTileAround(const int3& centerPos) const;
MapRect extendTileAroundSafely(const int3& centerPos) const; /// doesn't exceed map size
CMap* map;
};
/// The CComposedOperation is an operation which consists of several operations.
class DLL_LINKAGE CComposedOperation : public CMapOperation
{
public:
CComposedOperation(CMap* map);
void execute() override;
void undo() override;
void redo() override;
std::string getLabel() const override;
void addOperation(std::unique_ptr<CMapOperation>&& operation);
private:
std::list<std::unique_ptr<CMapOperation> > operations;
};
/// The CDrawTerrainOperation class draws a terrain area on the map.
class CDrawTerrainOperation : public CMapOperation
{
public:
CDrawTerrainOperation(CMap* map, const CTerrainSelection& terrainSel, Terrain terType, CRandomGenerator* gen);
void execute() override;
void undo() override;
void redo() override;
std::string getLabel() const override;
private:
struct ValidationResult
{
ValidationResult(bool result, const std::string& transitionReplacement = "");
bool result;
/// The replacement of a T rule, either D or S.
std::string transitionReplacement;
int flip;
};
struct InvalidTiles
{
std::set<int3> foreignTiles, nativeTiles;
bool centerPosValid;
InvalidTiles() : centerPosValid(false) { }
};
void updateTerrainTypes();
void invalidateTerrainViews(const int3& centerPos);
InvalidTiles getInvalidTiles(const int3& centerPos) const;
void updateTerrainViews();
/// Validates the terrain view of the given position and with the given pattern. The first method wraps the
/// second method to validate the terrain view with the given pattern in all four flip directions(horizontal, vertical).
ValidationResult validateTerrainView(const int3& pos, const std::vector<TerrainViewPattern>* pattern, int recDepth = 0) const;
ValidationResult validateTerrainViewInner(const int3& pos, const TerrainViewPattern& pattern, int recDepth = 0) const;
CTerrainSelection terrainSel;
Terrain terType;
CRandomGenerator* gen;
std::set<int3> invalidatedTerViews;
};
/// The CClearTerrainOperation clears+initializes the terrain.
class CClearTerrainOperation : public CComposedOperation
{
public:
CClearTerrainOperation(CMap* map, CRandomGenerator* gen);
std::string getLabel() const override;
private:
};
/// The CInsertObjectOperation class inserts an object to the map.
class CInsertObjectOperation : public CMapOperation
{
public:
CInsertObjectOperation(CMap* map, CGObjectInstance* obj);
void execute() override;
void undo() override;
void redo() override;
std::string getLabel() const override;
private:
CGObjectInstance* obj;
};
/// The CMoveObjectOperation class moves object to another position
class CMoveObjectOperation : public CMapOperation
{
public:
CMoveObjectOperation(CMap* map, CGObjectInstance* obj, const int3& targetPosition);
void execute() override;
void undo() override;
void redo() override;
std::string getLabel() const override;
private:
CGObjectInstance* obj;
int3 initialPos;
int3 targetPos;
};
/// The CRemoveObjectOperation class removes object from the map
class CRemoveObjectOperation : public CMapOperation
{
public:
CRemoveObjectOperation(CMap* map, CGObjectInstance* obj);
~CRemoveObjectOperation();
void execute() override;
void undo() override;
void redo() override;
std::string getLabel() const override;
private:
CGObjectInstance* obj;
};