mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Fix crash on using StupidAI for player actions
This commit is contained in:
		| @@ -16,8 +16,6 @@ | ||||
| #include "../../lib/battle/BattleAction.h" | ||||
| #include "../../lib/battle/BattleInfo.h" | ||||
|  | ||||
| static std::shared_ptr<CBattleCallback> cbc; | ||||
|  | ||||
| CStupidAI::CStupidAI() | ||||
| 	: side(-1) | ||||
| 	, wasWaitingForRealize(false) | ||||
| @@ -41,7 +39,7 @@ void CStupidAI::initBattleInterface(std::shared_ptr<Environment> ENV, std::share | ||||
| { | ||||
| 	print("init called, saving ptr to IBattleCallback"); | ||||
| 	env = ENV; | ||||
| 	cbc = cb = CB; | ||||
| 	cb = CB; | ||||
|  | ||||
| 	wasWaitingForRealize = CB->waitTillRealize; | ||||
| 	wasUnlockingGs = CB->unlockGsWhenWaiting; | ||||
| @@ -72,11 +70,11 @@ public: | ||||
| 	std::vector<BattleHex> attackFrom; //for melee fight | ||||
| 	EnemyInfo(const CStack * _s) : s(_s), adi(0), adr(0) | ||||
| 	{} | ||||
| 	void calcDmg(const BattleID & battleID, const CStack * ourStack) | ||||
| 	void calcDmg(std::shared_ptr<CBattleCallback> cb, const BattleID & battleID, const CStack * ourStack) | ||||
| 	{ | ||||
| 		// FIXME: provide distance info for Jousting bonus | ||||
| 		DamageEstimation retal; | ||||
| 		DamageEstimation dmg = cbc->getBattle(battleID)->battleEstimateDamage(ourStack, s, 0, &retal); | ||||
| 		DamageEstimation dmg = cb->getBattle(battleID)->battleEstimateDamage(ourStack, s, 0, &retal); | ||||
| 		adi = static_cast<int>((dmg.damage.min + dmg.damage.max) / 2); | ||||
| 		adr = static_cast<int>((retal.damage.min + retal.damage.max) / 2); | ||||
| 	} | ||||
| @@ -92,14 +90,14 @@ bool isMoreProfitable(const EnemyInfo &ei1, const EnemyInfo& ei2) | ||||
| 	return (ei1.adi-ei1.adr) < (ei2.adi - ei2.adr); | ||||
| } | ||||
|  | ||||
| static bool willSecondHexBlockMoreEnemyShooters(const BattleID & battleID, const BattleHex &h1, const BattleHex &h2) | ||||
| static bool willSecondHexBlockMoreEnemyShooters(std::shared_ptr<CBattleCallback> cb, const BattleID & battleID, const BattleHex &h1, const BattleHex &h2) | ||||
| { | ||||
| 	int shooters[2] = {0}; //count of shooters on hexes | ||||
|  | ||||
| 	for(int i = 0; i < 2; i++) | ||||
| 	{ | ||||
| 		for (auto & neighbour : (i ? h2 : h1).neighbouringTiles()) | ||||
| 			if(const auto * s = cbc->getBattle(battleID)->battleGetUnitByPos(neighbour)) | ||||
| 			if(const auto * s = cb->getBattle(battleID)->battleGetUnitByPos(neighbour)) | ||||
| 				if(s->isShooter()) | ||||
| 					shooters[i]++; | ||||
| 	} | ||||
| @@ -169,10 +167,10 @@ void CStupidAI::activeStack(const BattleID & battleID, const CStack * stack) | ||||
| 	} | ||||
|  | ||||
| 	for ( auto & enemy : enemiesReachable ) | ||||
| 		enemy.calcDmg(battleID, stack); | ||||
| 		enemy.calcDmg(cb, battleID, stack); | ||||
|  | ||||
| 	for ( auto & enemy : enemiesShootable ) | ||||
| 		enemy.calcDmg(battleID, stack); | ||||
| 		enemy.calcDmg(cb, battleID, stack); | ||||
|  | ||||
| 	if(enemiesShootable.size()) | ||||
| 	{ | ||||
| @@ -183,7 +181,7 @@ void CStupidAI::activeStack(const BattleID & battleID, const CStack * stack) | ||||
| 	else if(enemiesReachable.size()) | ||||
| 	{ | ||||
| 		const EnemyInfo &ei= *std::max_element(enemiesReachable.begin(), enemiesReachable.end(), &isMoreProfitable); | ||||
| 		BattleHex targetHex = *std::max_element(ei.attackFrom.begin(), ei.attackFrom.end(), [&](auto a, auto b) { return willSecondHexBlockMoreEnemyShooters(battleID, a, b);}); | ||||
| 		BattleHex targetHex = *std::max_element(ei.attackFrom.begin(), ei.attackFrom.end(), [&](auto a, auto b) { return willSecondHexBlockMoreEnemyShooters(cb, battleID, a, b);}); | ||||
|  | ||||
| 		cb->battleMakeUnitAction(battleID, BattleAction::makeMeleeAttack(stack, ei.s->getPosition(), targetHex)); | ||||
| 		return; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user