1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

Fixes to tower rework

This commit is contained in:
Opuszek
2025-08-13 21:58:54 +02:00
parent 64e4641702
commit 75f2b24b69

View File

@@ -459,6 +459,7 @@ bool BattleFlowProcessor::tryMakeAutomaticActionOfBallistaOrTowers(const CBattle
struct TargetInfo struct TargetInfo
{ {
bool insideTheWalls;
bool canAttackNextTurn; bool canAttackNextTurn;
bool isParalyzed; bool isParalyzed;
bool isMachine; bool isMachine;
@@ -468,7 +469,7 @@ bool BattleFlowProcessor::tryMakeAutomaticActionOfBallistaOrTowers(const CBattle
const auto & getCanAttackNextTurn = [&battle] (const battle::Unit * unit) const auto & getCanAttackNextTurn = [&battle] (const battle::Unit * unit)
{ {
if (unit->canShoot()) if (battle.battleCanShoot(unit))
return true; return true;
BattleHexArray attackableHexes; BattleHexArray attackableHexes;
@@ -478,24 +479,31 @@ bool BattleFlowProcessor::tryMakeAutomaticActionOfBallistaOrTowers(const CBattle
const auto & getTowerAttackValue = [&battle, &next] (const battle::Unit * unit) const auto & getTowerAttackValue = [&battle, &next] (const battle::Unit * unit)
{ {
float singleHpValue = static_cast<float>(unit->unitType()->getAIValue()) / static_cast<float>(unit->getMaxHealth()); float unitValue = static_cast<float>(unit->unitType()->getAIValue());
float singleHpValue = unitValue / static_cast<float>(unit->getMaxHealth());
float fullHp = static_cast<float>(unit->getTotalHealth());
int distance = BattleHex::getDistance(next->getPosition(), unit->getPosition()); int distance = BattleHex::getDistance(next->getPosition(), unit->getPosition());
BattleAttackInfo attackInfo(next, unit, distance, true); BattleAttackInfo attackInfo(next, unit, distance, true);
DamageEstimation estimation = battle.calculateDmgRange(attackInfo); DamageEstimation estimation = battle.calculateDmgRange(attackInfo);
float avgDmg = (static_cast<float>(estimation.damage.max) + static_cast<float>(estimation.damage.min)) / 2; float avgDmg = (static_cast<float>(estimation.damage.max) + static_cast<float>(estimation.damage.min)) / 2;
float realAvgDmg = avgDmg > fullHp ? fullHp : avgDmg;
float avgUnitKilled = (static_cast<float>(estimation.kills.max) + static_cast<float>(estimation.kills.min)) / 2;
float dmgValue = realAvgDmg * singleHpValue;
float killValue = avgUnitKilled * unitValue;
return avgDmg * singleHpValue; return dmgValue + killValue;
}; };
std::vector<TargetInfo>targetsInfo; std::vector<TargetInfo>targetsInfo;
for (const CStack * possibleTarget : possibleTargets) for (const CStack * possibleTarget : possibleTargets)
{ {
bool isParalyzed = possibleTarget->hasBonusOfType(BonusType::NOT_ACTIVE) && possibleTarget->unitType()->warMachine != ArtifactID::AMMO_CART;
bool isMachine = possibleTarget->unitType()->warMachine != ArtifactID::NONE; bool isMachine = possibleTarget->unitType()->warMachine != ArtifactID::NONE;
bool isParalyzed = possibleTarget->hasBonusOfType(BonusType::NOT_ACTIVE) && !isMachine;
const TargetInfo targetInfo = const TargetInfo targetInfo =
{ {
battle.battleIsInsideWalls(possibleTarget->getPosition()),
getCanAttackNextTurn(possibleTarget), getCanAttackNextTurn(possibleTarget),
isParalyzed, isParalyzed,
isMachine, isMachine,
@@ -516,6 +524,9 @@ bool BattleFlowProcessor::tryMakeAutomaticActionOfBallistaOrTowers(const CBattle
if (candidate.canAttackNextTurn != current.canAttackNextTurn) if (candidate.canAttackNextTurn != current.canAttackNextTurn)
return candidate.canAttackNextTurn > current.canAttackNextTurn; return candidate.canAttackNextTurn > current.canAttackNextTurn;
if (candidate.insideTheWalls != current.insideTheWalls)
return candidate.insideTheWalls > current.insideTheWalls;
return candidate.towerAttackValue > current.towerAttackValue; return candidate.towerAttackValue > current.towerAttackValue;
}; };