float CUnitTable::GetCurrentDamageScore(const UnitDef* unit) { const int numEnemies = ai->ccb->GetEnemyUnits(&ai->unitIDs[0]); std::vector<int> enemiesOfType(ai->cb->GetNumUnitDefs() + 1, 0); float score = 0.01f; float totalCost = 0.01f; for (int i = 0; i < numEnemies; i++) { const UnitDef* udef = ai->ccb->GetUnitDef(ai->unitIDs[i]); if (udef != NULL) { enemiesOfType[udef->id]++; } } for (unsigned int i = 1; i < enemiesOfType.size(); i++) { bool b1 = unitTypes[i].def->builder; bool b2 = (enemiesOfType[i] > 0); // bool b3 = (!unit->speed && !unitTypes[i].def->speed); if (!b1 && b2 /* && !b3 */) { float costOfEnemiesOfThisType = ((unitTypes[i].def->metalCost * METAL2ENERGY) + unitTypes[i].def->energyCost) * enemiesOfType[i]; float currentScore = unitTypes[unit->id].DPSvsUnit[i] * costOfEnemiesOfThisType; /* if (unitTypes[i].DPSvsUnit[unit->id] * costofenemiesofthistype > 0) { currentscore -= (unitTypes[i].DPSvsUnit[unit->id] * costofenemiesofthistype); } */ totalCost += costOfEnemiesOfThisType; score += currentScore; } } if (totalCost <= 0) return 0.0f; return (score / totalCost); }
void CUnitTable::UpdateChokePointArray() { std::vector<float> EnemyCostsByMoveType(ai->pather->NumOfMoveTypes); std::vector<int> enemiesOfType(ai->cb->GetNumUnitDefs() + 1, 0); float totalCost = 1.0f; int numEnemies = ai->ccb->GetEnemyUnits(&ai->unitIDs[0]); for (int i = 0; i < ai->pather->totalcells; i++) { ai->dm->ChokePointArray[i] = 0; } for (int i = 0; i < ai->pather->NumOfMoveTypes; i++) { EnemyCostsByMoveType[i] = 0; } for (int i = 0; i < numEnemies; i++) { enemiesOfType[ai->ccb->GetUnitDef(ai->unitIDs[i])->id]++; } for (unsigned int i = 1; i < enemiesOfType.size(); i++) { if (!unitTypes[i].def->canfly && unitTypes[i].def->speed > 0) { float currentcosts = ((unitTypes[i].def->metalCost * METAL2ENERGY) + unitTypes[i].def->energyCost) * (enemiesOfType[i]); // non-zero speed implies non-NULL movedata EnemyCostsByMoveType[(unitTypes[i].def)->movedata->pathType] += currentcosts; totalCost += currentcosts; } } for (int i = 0; i < ai->pather->NumOfMoveTypes; i++) { EnemyCostsByMoveType[i] /= totalCost; for (int c = 0; c < ai->pather->totalcells; c++) { ai->dm->ChokePointArray[c] += ai->dm->ChokeMapsByMovetype[i][c] * EnemyCostsByMoveType[i]; } } }