Code:
int pathCost(FAStarNode* parent, FAStarNode* node, int data, const void* pointer, FAStar* finder)
{
PROFILE_FUNC();
CvSelectionGroup* pSelectionGroup;
int iCost;
int iCostMoves;
int iWorstCostMoves;
int iCostMoveDenominator;
int iWorstCostMoveDenominator;
int iStartMoves;
int iStartMoveDenominator;
int iStartMovesInverse;
int iFlatMoves;
int iBaseMoves;
int iActionMoves;
int iPlotCost;
bool bMaxMoves;
bool bDefensiveBonus;
bool bAlwaysHostile;
bool bIsRiverCrossing;
CvPlot& kFromPlot = *GC.getMapINLINE().plotSorenINLINE(parent->m_iX, parent->m_iY);
FAssert(&kFromPlot != NULL);
CvPlot& kToPlot = *GC.getMapINLINE().plotSorenINLINE(node->m_iX, node->m_iY);
FAssert(&kToPlot != NULL);
bMaxMoves = (gDLL->getFAStarIFace()->GetInfo(finder) & MOVE_MAX_MOVES);
pSelectionGroup = ((CvSelectionGroup *)pointer);
iCost = MAX_INT;
iWorstCostMoves = (bMaxMoves) ? (1) : (0);
iWorstCostMoveDenominator = 1;
bIsRiverCrossing = kToPlot.isRiverCrossing(kFromPlot);
bDefensiveBonus = false;
bAlwaysHostile = false;
iPlotCost = kToPlot.plotCost(bIsRiverCrossing);
iStartMoves = parent->m_iData1;
iStartMoveDenominator = GC.getMapINLINE().getPathMoveDenominatorINLINE(node->m_iX, node->m_iY);
if (iStartMoves == iStartMoveDenominator)
{
iStartMoves = 0;
iStartMoveDenominator = 1;
}
iStartMovesInverse = iStartMoveDenominator - iStartMoves;
for (CLLNode<IDInfo>* pUnitNode = pSelectionGroup->headUnitNode(); pUnitNode != NULL; pUnitNode = pSelectionGroup->nextUnitNode(pUnitNode))
{
const CvUnit& kLoopUnit = *::getUnit(pUnitNode->m_data);
if(parent->m_iData2 == 1)
{
iFlatMoves = kLoopUnit.flatMoves();
}
else
{
iFlatMoves = kLoopUnit.getFlatMoves();
}
iBaseMoves = kLoopUnit.baseMoves();
iActionMoves = iBaseMoves + iFlatMoves;
if(isMoveFractionGreaterEqualThanINLINE(iStartMoves, iStartMoveDenominator, iBaseMoves, iActionMoves))
{
iCostMoves = 1;
iCostMoveDenominator = iActionMoves;
}
else
{
iCostMoves = kToPlot.plotCostDiscount(kLoopUnit, iPlotCost);
iCostMoveDenominator = kToPlot.movementMoveDenominator(kLoopUnit, kFromPlot, iCostMoves, bIsRiverCrossing, iBaseMoves, iFlatMoves);
}
if(bMaxMoves)
{
if(isMoveFractionGreaterThanINLINE(iWorstCostMoves, iWorstCostMoveDenominator, iCostMoves, iCostMoveDenominator))
{
iWorstCostMoves = iCostMoves;
iWorstCostMoveDenominator = iCostMoveDenominator;
}
continue;
}
if(isMoveFractionGreaterThanINLINE(iCostMoves, iCostMoveDenominator, iWorstCostMoves, iWorstCostMoveDenominator))
{
iWorstCostMoves = iCostMoves;
iWorstCostMoveDenominator = iCostMoveDenominator;
if(!(bDefensiveBonus || kLoopUnit.noDefensiveBonus()))
{
bDefensiveBonus = true;
}
if(!(bAlwaysHostile || kLoopUnit.isAlwaysHostile()))
{
bAlwaysHostile = true;
}
}
}
if(isMoveFractionGreaterThanINLINE(iCostMoves, iCostMoveDenominator, iStartMovesInverse, iStartMoveDenominator))
{
iCost = PATH_MOVEMENT_WEIGHT * std::max(1, (GC.getMOVE_DENOMINATOR() * iStartMovesInverse) / iStartMoveDenominator);
}
else
{
iCost = PATH_MOVEMENT_WEIGHT * std::max(1, (GC.getMOVE_DENOMINATOR() * iWorstCostMoves) / iWorstCostMoveDenominator);
}
FAssert(iCost != MAX_INT);
if(gDLL->getFAStarIFace()->GetInfo(finder) & (MOVE_AVOID_ENEMY_WEIGHT_3 | MOVE_AVOID_ENEMY_WEIGHT_2))
{
TeamTypes eGroupTeam = pSelectionGroup->getHeadTeam();
for (TeamTypes eTeam = (TeamTypes)0; eTeam < MAX_TEAMS; eTeam = (TeamTypes)(eTeam + 1))
{
if(kToPlot.getVisibilityCount(eTeam) > 0 && ((bAlwaysHostile && eTeam != pSelectionGroup->getTeam()) || GET_TEAM(eGroupTeam).isAtWar(eTeam) || GET_TEAM(eGroupTeam).AI_getWarPlan(kToPlot.getTeam())))
{
bAlwaysHostile = true;
iCost *= PATH_MOVE_AVOID_ENEMY_WEIGHT;
break;
}
}
}
if (bAlwaysHostile)
{
if (kToPlot.isOwned() && kToPlot.getTeam() != pSelectionGroup->getTeam())
{
iCost += PATH_ALWAYS_HOSTILE_WEIGHT;
}
}
if(iWorstCostMoves == iStartMovesInverse)
{
// Damage caused by features (mods)
if (0 != GC.getPATH_DAMAGE_WEIGHT())
{
if (kToPlot.getFeatureType() != NO_FEATURE)
{
iCost += (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(kToPlot.getFeatureType()).getTurnDamage())) / GC.getMAX_HIT_POINTS();
}
}
iCost += PATH_DEFENSE_WEIGHT;
if(bDefensiveBonus)
{
iCost -= std::min(PATH_DEFENSE_WEIGHT, kToPlot.defenseModifier(pSelectionGroup->getTeam(), false));
}
}
iCost += PATH_DEFENSE_WEIGHT;
if(bDefensiveBonus)
{
iCost -= std::min(PATH_DEFENSE_WEIGHT, kFromPlot.defenseModifier(pSelectionGroup->getTeam(), false));
}
if (kFromPlot.getTeam() != pSelectionGroup->getTeam())
{
iCost += PATH_TERRITORY_WEIGHT;
}
if (bIsRiverCrossing)
{
iCost += PATH_RIVER_WEIGHT;
}
if (!(kFromPlot.isCity()))
{
iCost += PATH_CITY_WEIGHT;
}
iCost += PATH_STEP_WEIGHT;
if ((kFromPlot.getX_INLINE() != kToPlot.getX_INLINE()) && (kFromPlot.getY_INLINE() != kToPlot.getY_INLINE()))
{
iCost += PATH_STRAIGHT_WEIGHT;
}
FAssert(iCost > 0);
// rucivfan_test rt[
//#ifdef _DEBUG
// if (GC.getLogging())
// {
// if (gDLL->getChtLvl() > 0)
// {
// char szOut[1024];
// sprintf(szOut, "Plot: (%d, %d) -> WorstCost = %d, parent: TotalCost = %d, KnownCost = %d, HeuristicCost = %d \n", pToPlot->getX_INLINE(), pToPlot->getY_INLINE(), iCost, parent->m_iTotalCost, parent->m_iKnownCost, parent->m_iHeuristicCost);
// gDLL->messageControlLog(szOut);
// //OutputDebugString(szOut);
// }
// }
//#endif
// ]rucivfan_test rt
return iCost;
}
Nur als Beispiel, wie es bei mir aussieht. Ich habe für dich leider schon eine komplette andere Bewegungspunktrechnung die auf Brüchen basiert um genaue Rechnungen der Bewegungspunkte immer möglich zu machen. Deswegen gibt es auch kein iWorstCost mehr. Desweiteren ist zu Berücksichtigen, dass ich hier mit Referenzen(Interne Pointer) arbeite.