Quellcode durchsuchen

AI will now devalue the usefulness of non-flying units when attacking defensive structures in order to prevent suiciding against castles

Xilmi vor 9 Monaten
Ursprung
Commit
6c4996ff54

+ 2 - 2
AI/Nullkiller/AIUtility.cpp

@@ -774,9 +774,9 @@ bool townHasFreeTavern(const CGTownInstance * town)
 	return canMoveVisitingHeroToGarrison;
 }
 
-uint64_t getHeroArmyStrengthWithCommander(const CGHeroInstance * hero, const CCreatureSet * heroArmy)
+uint64_t getHeroArmyStrengthWithCommander(const CGHeroInstance * hero, const CCreatureSet * heroArmy, int fortLevel)
 {
-	auto armyStrength = heroArmy->getArmyStrength();
+	auto armyStrength = heroArmy->getArmyStrength(fortLevel);
 
 	if(hero && hero->commander && hero->commander->alive)
 	{

+ 1 - 1
AI/Nullkiller/AIUtility.h

@@ -217,7 +217,7 @@ int64_t getArtifactScoreForHero(const CGHeroInstance * hero, const CArtifactInst
 int64_t getPotentialArtifactScore(const CArtifact * art);
 bool townHasFreeTavern(const CGTownInstance * town);
 
-uint64_t getHeroArmyStrengthWithCommander(const CGHeroInstance * hero, const CCreatureSet * heroArmy);
+uint64_t getHeroArmyStrengthWithCommander(const CGHeroInstance * hero, const CCreatureSet * heroArmy, int fortLevel = 0);
 
 uint64_t timeElapsed(std::chrono::time_point<std::chrono::high_resolution_clock> start);
 

+ 2 - 2
AI/Nullkiller/Engine/FuzzyHelper.cpp

@@ -127,9 +127,9 @@ ui64 FuzzyHelper::evaluateDanger(const CGObjectInstance * obj)
 			auto fortLevel = town->fortLevel();
 
 			if (fortLevel == CGTownInstance::EFortLevel::CASTLE)
-				danger = std::max(danger * 2, danger + 10000);
+				danger += 10000;
 			else if(fortLevel == CGTownInstance::EFortLevel::CITADEL)
-				danger = std::max(ui64(danger * 1.4), danger + 4000);
+				danger += 4000;
 		}
 
 		return danger;

+ 12 - 1
AI/Nullkiller/Pathfinding/AINodeStorage.cpp

@@ -1447,9 +1447,20 @@ void AINodeStorage::calculateChainInfo(std::vector<AIPath> & paths, const int3 &
 			}
 		}
 
+		int fortLevel = 0;
+		auto visitableObjects = cb->getVisitableObjs(pos);
+		for (auto obj : visitableObjects)
+		{
+			if (objWithID<Obj::TOWN>(obj))
+			{
+				auto town = dynamic_cast<const CGTownInstance*>(obj);
+				fortLevel = town->fortLevel();
+			}
+		}
+
 		path.targetObjectArmyLoss = evaluateArmyLoss(
 			path.targetHero,
-			getHeroArmyStrengthWithCommander(path.targetHero, path.heroArmy),
+			getHeroArmyStrengthWithCommander(path.targetHero, path.heroArmy, fortLevel),
 			path.targetObjectDanger);
 
 		path.chainMask = node.actor->chainMask;

+ 15 - 3
lib/CCreatureSet.cpp

@@ -353,11 +353,23 @@ bool CCreatureSet::needsLastStack() const
 	return false;
 }
 
-ui64 CCreatureSet::getArmyStrength() const
+ui64 CCreatureSet::getArmyStrength(int fortLevel) const
 {
 	ui64 ret = 0;
-	for(const auto & elem : stacks)
-		ret += elem.second->getPower();
+	for (const auto& elem : stacks)
+	{
+		ui64 powerToAdd = elem.second->getPower();
+		if (fortLevel > 0)
+		{
+			if (!elem.second->hasBonusOfType(BonusType::FLYING))
+			{
+				powerToAdd /= fortLevel;
+				if (!elem.second->hasBonusOfType(BonusType::SHOOTER))
+					powerToAdd /= fortLevel;
+			}
+		} 
+		ret += powerToAdd;
+	}
 	return ret;
 }
 

+ 1 - 1
lib/CCreatureSet.h

@@ -283,7 +283,7 @@ public:
 	bool slotEmpty(const SlotID & slot) const;
 	int stacksCount() const;
 	virtual bool needsLastStack() const; //true if last stack cannot be taken
-	ui64 getArmyStrength() const; //sum of AI values of creatures
+	ui64 getArmyStrength(int fortLevel = 0) const; //sum of AI values of creatures
 	ui64 getArmyCost() const; //sum of cost of creatures
 	ui64 getPower(const SlotID & slot) const; //value of specific stack
 	std::string getRoughAmount(const SlotID & slot, int mode = 0) const; //rough size of specific stack