// called from CAttackHandler::Update() void CAttackGroup::Update(int frameNr) { int frameSpread = 30; unsigned int numUnits = units.size(); if (!numUnits) { // empty attack group, nothing to update return; } float3 groupPosition = GetGroupPos(); if (groupPosition == ERRORVECTOR) return; // this part of the code checks for nearby enemies and does focus fire/maneuvering if ((frameNr % frameSpread) == ((groupID * 4) % frameSpread)) { isShooting = false; // get all enemies within attack range float range = highestAttackRange + 100.0f; int numEnemies = ai->cheat->GetEnemyUnits(&ai->unitIDs[0], groupPosition, range); if (numEnemies > 0) { // select one of the enemies int enemySelected = SelectEnemy(numEnemies, groupPosition); // for every unit, pathfind to enemy perifery (with personal range - 10) then // if distance to that last point in the path is < 10 or cost is 0, attack if (enemySelected != -1) { AttackEnemy(enemySelected, numUnits, range, frameSpread); } } } if (pathToTarget.size() >= 2) { // AssignToTarget() was called for this group so // we have an attack position and path, just move // (movement may be slow due to spreading of orders) if (!isShooting && isMoving && (frameNr % 60 == (groupID * 5) % frameSpread)) { MoveAlongPath(groupPosition, numUnits); } } else { // find something to attack within visual and radar LOS if AssignToTarget() wasn't called if ((defending && !isShooting && !isMoving) && (frameNr % 60 == groupID % 60)) { FindDefenseTarget(groupPosition, frameNr); } } }
void AAIGroup::AttackSector(AAISector *dest, float importance) { float3 pos; Command c; c.id = CMD_FIGHT; c.params.resize(3); // get position of the group pos = GetGroupPos(); int group_x = pos.x/ai->Getmap()->xSectorSize; int group_y = pos.z/ai->Getmap()->ySectorSize; c.params[0] = (dest->left + dest->right)/2; c.params[2] = (dest->bottom + dest->top)/2; // choose location that way that attacking units must cross the entire sector if(dest->x > group_x) c.params[0] = (dest->left + 7 * dest->right)/8; else if(dest->x < group_x) c.params[0] = (7 * dest->left + dest->right)/8; else c.params[0] = (dest->left + dest->right)/2; if(dest->y > group_y) c.params[2] = (7 * dest->bottom + dest->top)/8; else if(dest->y < group_y) c.params[2] = (dest->bottom + 7 * dest->top)/8; else c.params[2] = (dest->bottom + dest->top)/2; c.params[1] = ai->Getcb()->GetElevation(c.params[0], c.params[2]); // move group to that sector GiveOrder(&c, importance + 8, UNIT_ATTACKING, "Group::AttackSector"); target_sector = dest; task = GROUP_ATTACKING; }