- added smarts to the AI so it takes note of very active battle locations and scouts there.

This commit is contained in:
Mark Vejvoda 2013-01-12 01:55:13 +00:00
parent de1f7c53d9
commit 1a49588a45
3 changed files with 61 additions and 1 deletions

View File

@ -735,7 +735,18 @@ void Ai::sendScoutPatrol(){
&& random.randRange(0, 2) == 1;
bool megaResourceAttack=(aiInterface->getControlType() == ctCpuMega || aiInterface->getControlType() == ctNetworkCpuMega)
&& random.randRange(0, 1) == 1;
if( megaResourceAttack || ultraResourceAttack) {
std::vector<Vec2i> warningEnemyList = aiInterface->getEnemyWarningPositionList();
if(warningEnemyList.empty() == false) {
for(int i = warningEnemyList.size() - 1; i <= 0; --i) {
Vec2i &checkPos = warningEnemyList[i];
pos = checkPos;
possibleTargetFound = true;
aiInterface->removeEnemyWarningPositionFromList(checkPos);
break;
}
}
else if( megaResourceAttack || ultraResourceAttack) {
Map *map= aiInterface->getMap();
const TechTree *tt= aiInterface->getTechTree();

View File

@ -832,9 +832,23 @@ bool AiInterface::isFreeCells(const Vec2i &pos, int size, Field field){
return world->getMap()->isFreeCells(pos, size, field);
}
void AiInterface::removeEnemyWarningPositionFromList(Vec2i &checkPos) {
for(int i = enemyWarningPositionList.size() - 1; i <= 0; --i) {
Vec2i &pos = enemyWarningPositionList[i];
if(checkPos == pos) {
enemyWarningPositionList.erase(enemyWarningPositionList.begin()+i);
break;
}
}
}
const Unit *AiInterface::getFirstOnSightEnemyUnit(Vec2i &pos, Field &field, int radius) {
Map *map= world->getMap();
const int CHECK_RADIUS = 12;
const int WARNING_ENEMY_COUNT = 6;
for(int i = 0; i < world->getFactionCount(); ++i) {
for(int j = 0; j < world->getFaction(i)->getUnitCount(); ++j) {
Unit * unit= world->getFaction(i)->getUnit(j);
@ -850,6 +864,37 @@ const Unit *AiInterface::getFirstOnSightEnemyUnit(Vec2i &pos, Field &field, int
if(pos.dist(getHomeLocation()) < radius) {
printLog(2, "Being attacked at pos "+intToStr(pos.x)+","+intToStr(pos.y)+"\n");
// Now check if there are more than x enemies in sight and if
// so make note of the position
int foundEnemies = 0;
std::map<int,bool> foundEnemyList;
for(int aiX = pos.x-CHECK_RADIUS; aiX < pos.x + CHECK_RADIUS; ++aiX) {
for(int aiY = pos.y-CHECK_RADIUS; aiY < pos.y + CHECK_RADIUS; ++aiY) {
Vec2i checkPos(aiX,aiY);
if(map->isInside(checkPos) && map->isInsideSurface(map->toSurfCoords(checkPos))) {
Cell *cAI = map->getCell(checkPos);
SurfaceCell *scAI = map->getSurfaceCell(Map::toSurfCoords(checkPos));
if(scAI != NULL && cAI != NULL && cAI->getUnit(field) != NULL && sc->isVisible(teamIndex)) {
const Unit *checkUnit = cAI->getUnit(field);
if(foundEnemyList.find(checkUnit->getId()) == foundEnemyList.end()) {
bool cannotSeeUnitAI = (checkUnit->getType()->hasCellMap() == true &&
checkUnit->getType()->getAllowEmptyCellMap() == true &&
checkUnit->getType()->hasEmptyCellMap() == true);
if(cannotSeeUnitAI == false && isAlly(checkUnit) == false
&& checkUnit->isAlive() == true) {
foundEnemies++;
foundEnemyList[checkUnit->getId()] = true;
}
}
}
}
}
}
if(foundEnemies >= WARNING_ENEMY_COUNT) {
if(std::find(enemyWarningPositionList.begin(),enemyWarningPositionList.end(),pos) == enemyWarningPositionList.end()) {
enemyWarningPositionList.push_back(pos);
}
}
return unit;
}
}

View File

@ -80,6 +80,7 @@ private:
Mutex *aiMutex;
AiInterfaceThread *workerThread;
std::vector<Vec2i> enemyWarningPositionList;
public:
AiInterface(Game &game, int factionIndex, int teamIndex, int useStartLocation=-1);
@ -88,6 +89,9 @@ public:
//main
void update();
std::vector<Vec2i> getEnemyWarningPositionList() const { return enemyWarningPositionList; }
void removeEnemyWarningPositionFromList(Vec2i &checkPos);
inline Mutex * getMutex() {return aiMutex;}
void signalWorkerThread(int frameIndex);