| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 | 
							
- /*
 
-  * CMapEditManager.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 "../CRandomGenerator.h"
 
- #include "CMap.h"
 
- class CGObjectInstance;
 
- namespace ETerrainGroup
 
- {
 
- 	/**
 
- 	 * This enumeration lists terrain groups which differ in the terrain view frames alignment.
 
- 	 */
 
- 	enum ETerrainGroup
 
- 	{
 
- 		NORMAL,
 
- 		DIRT,
 
- 		SAND,
 
- 		WATER,
 
- 		ROCK
 
- 	};
 
- }
 
- /**
 
-  * The terrain view pattern describes a specific composition of terrain tiles
 
-  * in a 3x3 matrix and notes which terrain view frame numbers can be used.
 
-  */
 
- struct TerrainViewPattern
 
- {
 
- 	/**
 
- 	 * A weighted rule struct is a combination of the rule name and optionally points.
 
- 	 */
 
- 	struct WeightedRule
 
- 	{
 
- 		/** The name of the rule. Can be any value of the RULE_* constants or a ID of a another pattern. */
 
- 		std::string name;
 
- 		/** Optional. A rule can have points. Patterns may have a minimum count of points to reach to be successful. */
 
- 		int points;
 
- 		/**
 
- 		 * Constructor.
 
- 		 */
 
- 		WeightedRule();
 
- 		/**
 
- 		 * Gets true if this rule is a standard rule which means that it has a value of one of the RULE_* constants.
 
- 		 *
 
- 		 * @return true for a standard rule
 
- 		 */
 
- 		bool isStandardRule() const;
 
- 	};
 
- 	/** Constant for the flip mode same image. Pattern will be flipped and the same image will be used(which is given in the mapping). */
 
- 	static const std::string FLIP_MODE_SAME_IMAGE;
 
- 	/** Constant for the flip mode different images. Pattern will be flipped and different images will be used(mapping area is divided into 4 parts) */
 
- 	static const std::string FLIP_MODE_DIFF_IMAGES;
 
- 	/** Constant for the rule dirt, meaning a dirty border is required. */
 
- 	static const std::string RULE_DIRT;
 
- 	/** Constant for the rule sand, meaning a sandy border is required. */
 
- 	static const std::string RULE_SAND;
 
- 	/** Constant for the rule transition, meaning a dirty OR sandy border is required. */
 
- 	static const std::string RULE_TRANSITION;
 
- 	/** Constant for the rule native, meaning a native type is required. */
 
- 	static const std::string RULE_NATIVE;
 
- 	/** Constant for the rule any, meaning a native type, dirty OR sandy border is required. */
 
- 	static const std::string RULE_ANY;
 
- 	/**
 
- 	 * Default constructor.
 
- 	 */
 
- 	TerrainViewPattern();
 
- 	/**
 
- 	 * The pattern data.
 
- 	 *
 
- 	 * It can be visualized as a 3x3 matrix:
 
- 	 * [ ][ ][ ]
 
- 	 * [ ][ ][ ]
 
- 	 * [ ][ ][ ]
 
- 	 *
 
- 	 * The box in the center belongs always to the native terrain type and
 
- 	 * is the point of origin. Depending on the terrain type different rules
 
- 	 * can be used. Their meaning differs also from type to type.
 
- 	 *
 
- 	 * std::vector -> several rules can be used in one cell
 
- 	 */
 
- 	std::array<std::vector<WeightedRule>, 9> data;
 
- 	/** The identifier of the pattern, if it's referenced from a another pattern. */
 
- 	std::string id;
 
- 	/**
 
- 	 * This describes the mapping between this pattern and the corresponding range of frames
 
- 	 * which should be used for the ter view.
 
- 	 *
 
- 	 * std::vector -> size=1: typical, size=2: if this pattern should map to two different types of borders
 
- 	 * std::pair   -> 1st value: lower range, 2nd value: upper range
 
- 	 */
 
- 	std::vector<std::pair<int, int> > mapping;
 
- 	/** The minimum points to reach to to validate the pattern successfully. */
 
- 	int minPoints;
 
- 	/** Describes if flipping is required and which mapping should be used. */
 
- 	std::string flipMode;
 
- 	/** The terrain group to which the pattern belongs to. */
 
- 	ETerrainGroup::ETerrainGroup terGroup;
 
- };
 
- /**
 
-  * The terrain view pattern config loads pattern data from the filesystem.
 
-  */
 
- class CTerrainViewPatternConfig
 
- {
 
- public:
 
- 	/**
 
- 	 * Constructor. Initializes the patterns data.
 
- 	 */
 
- 	CTerrainViewPatternConfig();
 
- 	/**
 
- 	 * Gets the patterns for a specific group of terrain.
 
- 	 *
 
- 	 * @param terGroup the terrain group e.g. normal for grass, lava,... OR dirt OR sand,...
 
- 	 * @return a vector containing patterns
 
- 	 */
 
- 	const std::vector<TerrainViewPattern> & getPatternsForGroup(ETerrainGroup::ETerrainGroup terGroup) const;
 
- 	/**
 
- 	 * Gets a pattern by ID. Throws if pattern isn't available(config error).
 
- 	 *
 
- 	 * @param terGroup the terrain group e.g. normal for grass, lava,... OR dirt OR sand,...
 
- 	 * @param id the id of the pattern
 
- 	 * @return the pattern which matches the ID
 
- 	 */
 
- 	const TerrainViewPattern & getPatternById(ETerrainGroup::ETerrainGroup terGroup, const std::string & id) const;
 
- private:
 
- 	/** The patterns data. */
 
- 	std::map<ETerrainGroup::ETerrainGroup, std::vector<TerrainViewPattern> > patterns;
 
- };
 
- /**
 
-  * The map edit manager provides functionality for drawing terrain and placing
 
-  * objects on the map.
 
-  *
 
-  * TODO add undo / selection functionality for the map editor
 
-  */
 
- class CMapEditManager
 
- {
 
- public:
 
- 	/**
 
- 	 * Constructor. The map object / terrain data has to be initialized.
 
- 	 *
 
- 	 * @param terViewPatternConfig the terrain view pattern config
 
- 	 * @param map the map object which should be edited
 
- 	 * @param randomSeed optional. the seed which is used for generating randomly terrain views
 
- 	 */
 
- 	CMapEditManager(const CTerrainViewPatternConfig * terViewPatternConfig, CMap * map, int randomSeed = std::time(nullptr));
 
- 	/**
 
- 	 * Clears the terrain. The free level is filled with water and the
 
- 	 * underground level with rock.
 
- 	 */
 
- 	void clearTerrain();
 
- 	/**
 
- 	 * Draws terrain.
 
- 	 *
 
- 	 * @param terType the type of the terrain to draw
 
- 	 * @param posx the x coordinate
 
- 	 * @param posy the y coordinate
 
- 	 * @param width the height of the terrain to draw
 
- 	 * @param height the width of the terrain to draw
 
- 	 * @param underground true if you want to draw at the underground, false if open
 
- 	 */
 
- 	void drawTerrain(ETerrainType::ETerrainType terType, int posx, int posy, int width, int height, bool underground);
 
- 	/**
 
- 	 * Inserts an object.
 
- 	 *
 
- 	 * @param obj the object to insert
 
- 	 * @param posx the x coordinate
 
- 	 * @param posy the y coordinate
 
- 	 * @param underground true if you want to draw at the underground, false if open
 
- 	 */
 
- 	void insertObject(CGObjectInstance * obj, int posx, int posy, bool underground);
 
- private:
 
- 	/**
 
- 	 * The validation result struct represents the result of a pattern validation.
 
- 	 */
 
- 	struct ValidationResult
 
- 	{
 
- 		/**
 
- 		 * Constructor.
 
- 		 *
 
- 		 * @param result the result of the validation either true or false
 
- 		 * @param transitionReplacement optional. the replacement of a T rule, either D or S
 
- 		 */
 
- 		ValidationResult(bool result, const std::string & transitionReplacement = "");
 
- 		/** The result of the validation. */
 
- 		bool result;
 
- 		/** The replacement of a T rule, either D or S. */
 
- 		std::string transitionReplacement;
 
- 	};
 
- 	/**
 
- 	 * Updates the terrain view ids in the specified area.
 
- 	 *
 
- 	 * @param posx the x coordinate
 
- 	 * @param posy the y coordinate
 
- 	 * @param width the height of the terrain to update
 
- 	 * @param height the width of the terrain to update
 
- 	 * @param mapLevel the map level, 0 for open and 1 for underground
 
- 	 */
 
- 	void updateTerrainViews(int posx, int posy, int width, int height, int mapLevel);
 
- 	/**
 
- 	 * Gets the terrain group by the terrain type number.
 
- 	 *
 
- 	 * @param terType the terrain type
 
- 	 * @return the terrain group
 
- 	 */
 
- 	ETerrainGroup::ETerrainGroup getTerrainGroup(ETerrainType::ETerrainType terType) const;
 
- 	/**
 
- 	 * Validates the terrain view of the given position and with the given pattern.
 
- 	 *
 
- 	 * @param posx the x position
 
- 	 * @param posy the y position
 
- 	 * @param mapLevel the map level, 0 for open and 1 for underground
 
- 	 * @param pattern the pattern to validate the terrain view with
 
- 	 * @param recDepth the depth of the recursion, 0 for no recursion - 1 for recursion
 
- 	 * @return a validation result struct
 
- 	 */
 
- 	ValidationResult validateTerrainView(int posx, int posy, int mapLevel, const TerrainViewPattern & pattern, int recDepth = 0) const;
 
- 	/**
 
- 	 * Tests whether the given terrain type is a sand type. Sand types are: Water, Sand and Rock
 
- 	 *
 
- 	 * @param terType the terrain type to test
 
- 	 * @return true if the terrain type is a sand type, otherwise false
 
- 	 */
 
- 	bool isSandType(ETerrainType::ETerrainType terType) const;
 
- 	/**
 
- 	 * Gets a flipped pattern.
 
- 	 *
 
- 	 * @param pattern the original pattern to flip
 
- 	 * @param flip the flip mode value, see FLIP_PATTERN_* constants for details
 
- 	 * @return the flipped pattern
 
- 	 */
 
- 	TerrainViewPattern getFlippedPattern(const TerrainViewPattern & pattern, int flip) const;
 
- 	/** Constant for flipping a pattern horizontally. */
 
- 	static const int FLIP_PATTERN_HORIZONTAL = 1;
 
- 	/** Constant for flipping a pattern vertically. */
 
- 	static const int FLIP_PATTERN_VERTICAL = 2;
 
- 	/** Constant for flipping a pattern horizontally and vertically. */
 
- 	static const int FLIP_PATTERN_BOTH = 3;
 
- 	/** The map object to edit. */
 
- 	CMap * map;
 
- 	/** The random number generator. */
 
- 	CRandomGenerator gen;
 
- 	/** The terrain view pattern config. */
 
- 	const CTerrainViewPatternConfig * terViewPatternConfig;
 
- };
 
 
  |