176
General discussion / Re: Making the AI constantly Attack?...
« on: 15 April 2011, 06:50:02 »
another crash fix was required, and it was using an evil M$ extension to std::map<> 
Ai::evaluateEnemies() now looks like this:

Ai::evaluateEnemies() now looks like this:
Code: [Select]
void Ai::evaluateEnemies() {
// 1. maintain knownEnemyLocations
// remove if enemy building is dead and visible, null Unit pointers if dead and not visible
const int teamIndex = aiInterface->getFaction()->getTeam();
UnitPositions::iterator it = m_knownEnemyLocations.begin();
UnitPositions::iterator itEnd = m_knownEnemyLocations.end();
vector<Vec2i> remList;
while (it != itEnd) {
const Vec2i tPos = Map::toTileCoords(it->first);
bool canSee = g_map.getTile(tPos)->isVisible(teamIndex);
bool dead = it->second == 0;
if (canSee) {
if (dead || it->second->isDead()) {
remList.push_back(it->first);
}
} else {
if (!dead) {
if (it->second->isDead()) {
it->second = 0;
}
}
}
++it;
}
foreach (vector<Vec2i>, it, remList) {
m_knownEnemyLocations.erase(*it);
}
// 2. refresh visibleEnemies and closestEnemy
m_visibleEnemies.clear();
aiInterface->findEnemies(m_visibleEnemies, m_closestEnemy);
// 3. update knownEnemyLocations with any previously unseen enemy buildings
foreach_const (ConstUnitVector, it, m_visibleEnemies) {
const Unit &enemy = **it;
if (enemy.isBuilding()) {
Vec2i bPos = enemy.getCenteredPos();
if (m_knownEnemyLocations.find(bPos) == m_knownEnemyLocations.end()) {
m_knownEnemyLocations[bPos] = &enemy;
}
}
}
}




Too long to make a difference to us now, but its not never.

