CvUnit* CvSelectionGroupAI::AI_getBestGroupSacrifice(const CvPlot* pPlot, bool bPotentialEnemy, bool bForce, bool bNoBlitz) const { int iBestValue = 0; CvUnit* pBestUnit = NULL; CLLNode<IDInfo>* pUnitNode = headUnitNode(); while (pUnitNode != NULL) { CvUnit* pLoopUnit = ::getUnit(pUnitNode->m_data); pUnitNode = nextUnitNode(pUnitNode); if (!pLoopUnit->isDead()) { bool bCanAttack = false; if (pLoopUnit->getDomainType() == DOMAIN_AIR) { bCanAttack = pLoopUnit->canAirAttack(); } else { bCanAttack = pLoopUnit->canAttack(); if (bCanAttack && bNoBlitz && pLoopUnit->isBlitz() && pLoopUnit->isMadeAttack()) { bCanAttack = false; } } if (bCanAttack) { if (bForce || pLoopUnit->canMove()) { if (bForce || pLoopUnit->canMoveInto(pPlot, true)) { int iValue = pLoopUnit->AI_sacrificeValue(pPlot); FAssertMsg(iValue > 0, "iValue is expected to be greater than 0"); // we want to pick the last unit of highest value, so pick the last unit with a good value if (iValue >= iBestValue) { iBestValue = iValue; pBestUnit = pLoopUnit; } } } } } } return pBestUnit; }
CvUnit* CvSelectionGroupAI::AI_getBestGroupSacrifice(const CvPlot* pPlot, bool bPotentialEnemy, bool bForce, bool bNoBlitz) const { int iBestValue = 0; CvUnit* pBestUnit = NULL; CLLNode<IDInfo>* pUnitNode = headUnitNode(); while (pUnitNode != NULL) { CvUnit* pLoopUnit = ::getUnit(pUnitNode->m_data); pUnitNode = nextUnitNode(pUnitNode); if (!pLoopUnit->isDead()) { bool bCanAttack = false; if (pLoopUnit->getDomainType() == DOMAIN_AIR) { bCanAttack = pLoopUnit->canAirAttack(); } else { bCanAttack = pLoopUnit->canAttack(); if (bCanAttack && bNoBlitz && pLoopUnit->isBlitz() && pLoopUnit->isMadeAttack()) { bCanAttack = false; } } if (bCanAttack) { if (bForce || pLoopUnit->canMove()) { if (bForce || pLoopUnit->canMoveInto(pPlot, true)) { int iValue = pLoopUnit->AI_sacrificeValue(pPlot); FAssertMsg(iValue > 0, "iValue is expected to be greater than 0"); /*************************************************************************************************/ /** BETTER AI (Summons make good groupattack sacrifice units) Sephi **/ /** **/ /** **/ /*************************************************************************************************/ if (pLoopUnit->getDuration()>0) { iValue+=10000; } /*************************************************************************************************/ /** END **/ /*************************************************************************************************/ /*************************************************************************************************/ /** BETTER AI (Block some Units from attacking at low odds) Sephi **/ /** **/ /** **/ /*************************************************************************************************/ if (!GET_PLAYER(pLoopUnit->getOwnerINLINE()).isHuman()) { if (pLoopUnit->AI_getUnitAIType()==UNITAI_WARWIZARD) { iValue=1; } if (pLoopUnit->AI_getUnitAIType()==UNITAI_HERO) { iValue=1; } if (pLoopUnit->getLevel()>4) { iValue=1; } } /*************************************************************************************************/ /** END **/ /*************************************************************************************************/ // we want to pick the last unit of highest value, so pick the last unit with a good value if (iValue >= iBestValue) { iBestValue = iValue; pBestUnit = pLoopUnit; } } } } } } return pBestUnit; }