| 
					
				 | 
			
			
				@@ -40,67 +40,60 @@ namespace GameConstants 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	DLL_LINKAGE extern const std::string VCMI_VERSION;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int PUZZLE_MAP_PIECES = 48;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int PUZZLE_MAP_PIECES = 48;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int MAX_HEROES_PER_PLAYER = 8;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int AVAILABLE_HEROES_PER_PLAYER = 2;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int MAX_HEROES_PER_PLAYER = 8;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int AVAILABLE_HEROES_PER_PLAYER = 2;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int ALL_PLAYERS = 255; //bitfield
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int ALL_PLAYERS = 255; //bitfield
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int CREATURES_PER_TOWN = 7; //without upgrades
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int SPELL_LEVELS = 5;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int SPELL_SCHOOL_LEVELS = 4;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int CRE_LEVELS = 10; // number of creature experience levels
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int CREATURES_PER_TOWN = 7; //without upgrades
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int SPELL_LEVELS = 5;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int SPELL_SCHOOL_LEVELS = 4;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int CRE_LEVELS = 10; // number of creature experience levels
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int HERO_GOLD_COST = 2500;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int SPELLBOOK_GOLD_COST = 500;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int SKILL_GOLD_COST = 2000;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int BATTLE_PENALTY_DISTANCE = 10; //if the distance is > than this, then shooting stack has distance penalty
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int ARMY_SIZE = 7;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int SKILL_PER_HERO = 8;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const ui32 HERO_HIGH_LEVEL = 10; // affects primary skill upgrade order
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int HERO_GOLD_COST = 2500;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int SPELLBOOK_GOLD_COST = 500;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int SKILL_GOLD_COST = 2000;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int BATTLE_PENALTY_DISTANCE = 10; //if the distance is > than this, then shooting stack has distance penalty
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int ARMY_SIZE = 7;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int SKILL_PER_HERO = 8;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr ui32 HERO_HIGH_LEVEL = 10; // affects primary skill upgrade order
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int SKILL_QUANTITY=28;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int PRIMARY_SKILLS=4;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int RESOURCE_QUANTITY=8;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int HEROES_PER_TYPE=8; //amount of heroes of each type
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int SKILL_QUANTITY=28;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int PRIMARY_SKILLS=4;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int RESOURCE_QUANTITY=8;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int HEROES_PER_TYPE=8; //amount of heroes of each type
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// amounts of OH3 objects. Can be changed by mods, should be used only during H3 loading phase
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int F_NUMBER = 9;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int ARTIFACTS_QUANTITY=171;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int HEROES_QUANTITY=156;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int SPELLS_QUANTITY=70;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int CREATURES_COUNT = 197;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int F_NUMBER = 9;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int ARTIFACTS_QUANTITY=171;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int HEROES_QUANTITY=156;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int SPELLS_QUANTITY=70;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int CREATURES_COUNT = 197;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const ui32 BASE_MOVEMENT_COST = 100; //default cost for non-diagonal movement
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr ui32 BASE_MOVEMENT_COST = 100; //default cost for non-diagonal movement
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const int HERO_PORTRAIT_SHIFT = 30;// 2 special frames + some extra portraits
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr int HERO_PORTRAIT_SHIFT = 30;// 2 special frames + some extra portraits
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	const std::array<int, 11> POSSIBLE_TURNTIME = {1, 2, 4, 6, 8, 10, 15, 20, 25, 30, 0};
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr std::array<int, 11> POSSIBLE_TURNTIME = {1, 2, 4, 6, 8, 10, 15, 20, 25, 30, 0};
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define ID_LIKE_CLASS_COMMON(CLASS_NAME, ENUM_NAME)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CLASS_NAME(const CLASS_NAME & other)				\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	num = other.num;								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CLASS_NAME & operator=(const CLASS_NAME & other)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	num = other.num;								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return *this;									\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-explicit CLASS_NAME(si32 id)						\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr CLASS_NAME(const CLASS_NAME & other) = default;	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr CLASS_NAME & operator=(const CLASS_NAME & other) = default;	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+explicit constexpr CLASS_NAME(si32 id)				\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	: num(static_cast<ENUM_NAME>(id))				\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {}													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-operator ENUM_NAME() const							\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr operator ENUM_NAME() const				\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return num;										\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-si32 getNum() const									\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr si32 getNum() const						\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return static_cast<si32>(num);										\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return static_cast<si32>(num);					\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-ENUM_NAME toEnum() const							\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr ENUM_NAME toEnum() const					\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return num;										\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -108,36 +101,36 @@ template <typename Handler> void serialize(Handler &h, const int version)	\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	h & num;										\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CLASS_NAME & advance(int i)							\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr CLASS_NAME & advance(int i)				\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	num = (ENUM_NAME)((int)num + i);				\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	num = static_cast<ENUM_NAME>(static_cast<int>(num) + i);		\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return *this;									\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Operators are performance-critical and to be inlined they must be in header
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define ID_LIKE_OPERATORS_INTERNAL(A, B, AN, BN)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-STRONG_INLINE bool operator==(const A & a, const B & b)			\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+STRONG_INLINE constexpr bool operator==(const A & a, const B & b)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return AN == BN ;								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-STRONG_INLINE bool operator!=(const A & a, const B & b)			\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+STRONG_INLINE constexpr bool operator!=(const A & a, const B & b)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return AN != BN ;								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-STRONG_INLINE bool operator<(const A & a, const B & b)			\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+STRONG_INLINE constexpr bool operator<(const A & a, const B & b)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return AN < BN ;								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-STRONG_INLINE bool operator<=(const A & a, const B & b)			\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+STRONG_INLINE constexpr bool operator<=(const A & a, const B & b)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return AN <= BN ;								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-STRONG_INLINE bool operator>(const A & a, const B & b)			\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+STRONG_INLINE constexpr bool operator>(const A & a, const B & b)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return AN > BN ;								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-STRONG_INLINE bool operator>=(const A & a, const B & b)			\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+STRONG_INLINE constexpr bool operator>=(const A & a, const B & b)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {													\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return AN >= BN ;								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -150,17 +143,13 @@ STRONG_INLINE bool operator>=(const A & a, const B & b)			\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define INSTID_LIKE_CLASS_COMMON(CLASS_NAME, NUMERIC_NAME)	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public:														\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CLASS_NAME() : BaseForID<CLASS_NAME, NUMERIC_NAME>(-1) {}	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CLASS_NAME(const CLASS_NAME & other):						\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr CLASS_NAME(const CLASS_NAME & other):						\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	BaseForID<CLASS_NAME, NUMERIC_NAME>(other)				\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {															\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }															\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CLASS_NAME & operator=(const CLASS_NAME & other)			\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{															\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	num = other.num;										\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return *this;											\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}															\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-explicit CLASS_NAME(si32 id)								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr CLASS_NAME & operator=(const CLASS_NAME & other) = default;	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+constexpr CLASS_NAME & operator=(NUMERIC_NAME other) { num = other; return *this; };	\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+explicit constexpr CLASS_NAME(si32 id = -1)								\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	: BaseForID<CLASS_NAME, NUMERIC_NAME>(id)				\
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -171,13 +160,13 @@ protected: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	NumericType num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public:
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	NumericType getNum() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr NumericType getNum() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	//to make it more similar to IDLIKE
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	NumericType toEnum() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr NumericType toEnum() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -187,26 +176,26 @@ public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		h & num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	explicit BaseForID(NumericType _num = -1)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr explicit BaseForID(NumericType _num = -1) :
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		num(_num)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		num = _num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	void advance(int change)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr void advance(int change)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		num += change;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator == (const BaseForID & b) const { return num == b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator <= (const BaseForID & b) const { return num <= b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator >= (const BaseForID & b) const { return num >= b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator != (const BaseForID & b) const { return num != b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator <  (const BaseForID & b) const { return num <  b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator >  (const BaseForID & b) const { return num >  b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator == (const BaseForID & b) const { return num == b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator <= (const BaseForID & b) const { return num <= b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator >= (const BaseForID & b) const { return num >= b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator != (const BaseForID & b) const { return num != b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator <  (const BaseForID & b) const { return num <  b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator >  (const BaseForID & b) const { return num >  b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	BaseForID & operator++() { ++num; return *this; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr BaseForID & operator++() { ++num; return *this; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	operator NumericType() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr operator NumericType() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -223,12 +212,12 @@ private: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	NumericType num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public:
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	NumericType getNum() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr NumericType getNum() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	EnumType toEnum() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr EnumType toEnum() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return static_cast<EnumType>(num);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -238,42 +227,42 @@ public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		h & num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	explicit Identifier(NumericType _num = -1)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr explicit Identifier(NumericType _num = -1)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		num = _num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/* implicit */ Identifier(EnumType _num)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* implicit */constexpr Identifier(EnumType _num):
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		num(static_cast<NumericType>(_num))
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		num = static_cast<NumericType>(_num);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	void advance(int change)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr void advance(int change)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		num += change;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator == (const Identifier & b) const { return num == b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator <= (const Identifier & b) const { return num <= b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator >= (const Identifier & b) const { return num >= b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator != (const Identifier & b) const { return num != b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator <  (const Identifier & b) const { return num <  b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	bool operator >  (const Identifier & b) const { return num > b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator == (const Identifier & b) const { return num == b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator <= (const Identifier & b) const { return num <= b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator >= (const Identifier & b) const { return num >= b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator != (const Identifier & b) const { return num != b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator <  (const Identifier & b) const { return num <  b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr bool operator >  (const Identifier & b) const { return num > b.num; }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Identifier & operator++()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr Identifier & operator++()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		++num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return *this;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	Identifier operator++(int)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr Identifier operator++(int)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Identifier ret(*this);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		++num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return ret;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	operator NumericType() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	constexpr operator NumericType() const
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return num;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -449,7 +438,7 @@ namespace ETownType//deprecated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	};
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class FactionID : public BaseForID<FactionID, si32>
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class FactionID : public BaseForID<FactionID, int32_t>
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	INSTID_LIKE_CLASS_COMMON(FactionID, si32)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 |