| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | 
							- /*
 
-  * TurnInfo.cpp, 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
 
-  *
 
-  */
 
- #include "StdInc.h"
 
- #include "TurnInfo.h"
 
- #include "../TerrainHandler.h"
 
- #include "../VCMI_Lib.h"
 
- #include "../bonuses/BonusList.h"
 
- #include "../mapObjects/CGHeroInstance.h"
 
- #include "../mapObjects/MiscObjects.h"
 
- VCMI_LIB_NAMESPACE_BEGIN
 
- TurnInfo::BonusCache::BonusCache(const TConstBonusListPtr & bl)
 
- {
 
- 	for(const auto & terrain : VLC->terrainTypeHandler->objects)
 
- 	{
 
- 		auto selector = Selector::typeSubtype(BonusType::NO_TERRAIN_PENALTY, BonusSubtypeID(terrain->getId()));
 
- 		if (bl->getFirst(selector))
 
- 			noTerrainPenalty.insert(terrain->getId());
 
- 	}
 
- 	freeShipBoarding = static_cast<bool>(bl->getFirst(Selector::type()(BonusType::FREE_SHIP_BOARDING)));
 
- 	flyingMovement = static_cast<bool>(bl->getFirst(Selector::type()(BonusType::FLYING_MOVEMENT)));
 
- 	flyingMovementVal = bl->valOfBonuses(Selector::type()(BonusType::FLYING_MOVEMENT));
 
- 	waterWalking = static_cast<bool>(bl->getFirst(Selector::type()(BonusType::WATER_WALKING)));
 
- 	waterWalkingVal = bl->valOfBonuses(Selector::type()(BonusType::WATER_WALKING));
 
- 	pathfindingVal = bl->valOfBonuses(Selector::type()(BonusType::ROUGH_TERRAIN_DISCOUNT));
 
- }
 
- TurnInfo::TurnInfo(const CGHeroInstance * Hero, const int turn):
 
- 	hero(Hero),
 
- 	maxMovePointsLand(-1),
 
- 	maxMovePointsWater(-1),
 
- 	turn(turn)
 
- {
 
- 	bonuses = hero->getAllBonuses(Selector::days(turn), Selector::all, nullptr, "");
 
- 	bonusCache = std::make_unique<BonusCache>(bonuses);
 
- 	nativeTerrain = hero->getNativeTerrain();
 
- }
 
- bool TurnInfo::isLayerAvailable(const EPathfindingLayer & layer) const
 
- {
 
- 	switch(layer.toEnum())
 
- 	{
 
- 	case EPathfindingLayer::AIR:
 
- 		if(hero && hero->boat && hero->boat->layer == EPathfindingLayer::AIR)
 
- 			break;
 
- 		if(!hasBonusOfType(BonusType::FLYING_MOVEMENT))
 
- 			return false;
 
- 		break;
 
- 	case EPathfindingLayer::WATER:
 
- 		if(hero && hero->boat && hero->boat->layer == EPathfindingLayer::WATER)
 
- 			break;
 
- 		if(!hasBonusOfType(BonusType::WATER_WALKING))
 
- 			return false;
 
- 		break;
 
- 	}
 
- 	return true;
 
- }
 
- bool TurnInfo::hasBonusOfType(BonusType type) const
 
- {
 
- 	return hasBonusOfType(type, BonusSubtypeID());
 
- }
 
- bool TurnInfo::hasBonusOfType(BonusType type, BonusSubtypeID subtype) const
 
- {
 
- 	switch(type)
 
- 	{
 
- 	case BonusType::FREE_SHIP_BOARDING:
 
- 		return bonusCache->freeShipBoarding;
 
- 	case BonusType::FLYING_MOVEMENT:
 
- 		return bonusCache->flyingMovement;
 
- 	case BonusType::WATER_WALKING:
 
- 		return bonusCache->waterWalking;
 
- 	case BonusType::NO_TERRAIN_PENALTY:
 
- 		return bonusCache->noTerrainPenalty.count(subtype.as<TerrainId>());
 
- 	}
 
- 	return static_cast<bool>(
 
- 			bonuses->getFirst(Selector::type()(type).And(Selector::subtype()(subtype))));
 
- }
 
- int TurnInfo::valOfBonuses(BonusType type) const
 
- {
 
- 	return valOfBonuses(type, BonusSubtypeID());
 
- }
 
- int TurnInfo::valOfBonuses(BonusType type, BonusSubtypeID subtype) const
 
- {
 
- 	switch(type)
 
- 	{
 
- 	case BonusType::FLYING_MOVEMENT:
 
- 		return bonusCache->flyingMovementVal;
 
- 	case BonusType::WATER_WALKING:
 
- 		return bonusCache->waterWalkingVal;
 
- 	case BonusType::ROUGH_TERRAIN_DISCOUNT:
 
- 		return bonusCache->pathfindingVal;
 
- 	}
 
- 	return bonuses->valOfBonuses(Selector::type()(type).And(Selector::subtype()(subtype)));
 
- }
 
- int TurnInfo::getMaxMovePoints(const EPathfindingLayer & layer) const
 
- {
 
- 	if(maxMovePointsLand == -1)
 
- 		maxMovePointsLand = hero->movementPointsLimitCached(true, this);
 
- 	if(maxMovePointsWater == -1)
 
- 		maxMovePointsWater = hero->movementPointsLimitCached(false, this);
 
- 	return layer == EPathfindingLayer::SAIL ? maxMovePointsWater : maxMovePointsLand;
 
- }
 
- void TurnInfo::updateHeroBonuses(BonusType type, const CSelector& sel) const
 
- {
 
- 	switch(type)
 
- 	{
 
- 	case BonusType::FREE_SHIP_BOARDING:
 
- 		bonusCache->freeShipBoarding = static_cast<bool>(bonuses->getFirst(Selector::type()(BonusType::FREE_SHIP_BOARDING)));
 
- 		break;
 
- 	case BonusType::FLYING_MOVEMENT:
 
- 		bonusCache->flyingMovement = static_cast<bool>(bonuses->getFirst(Selector::type()(BonusType::FLYING_MOVEMENT)));
 
- 		bonusCache->flyingMovementVal = bonuses->valOfBonuses(Selector::type()(BonusType::FLYING_MOVEMENT));
 
- 		break;
 
- 	case BonusType::WATER_WALKING:
 
- 		bonusCache->waterWalking = static_cast<bool>(bonuses->getFirst(Selector::type()(BonusType::WATER_WALKING)));
 
- 		bonusCache->waterWalkingVal = bonuses->valOfBonuses(Selector::type()(BonusType::WATER_WALKING));
 
- 		break;
 
- 	case BonusType::ROUGH_TERRAIN_DISCOUNT:
 
- 		bonusCache->pathfindingVal = bonuses->valOfBonuses(Selector::type()(BonusType::ROUGH_TERRAIN_DISCOUNT));
 
- 		break;
 
- 	default:
 
- 		bonuses = hero->getAllBonuses(Selector::days(turn), Selector::all, nullptr, "");
 
- 	}
 
- }
 
- VCMI_LIB_NAMESPACE_END
 
 
  |