void GroundAI::ExecFrame(double secs) { const int exec_period = 1000; if ((int) Game::GameTime() - exec_time > exec_period) { exec_time = (int) Game::GameTime(); SelectTarget(); } if (ship) { Shield* shield = ship->GetShield(); if (shield) shield->SetPowerLevel(100); ListIter<WeaponGroup> iter = ship->Weapons(); while (++iter) { WeaponGroup* group = (WeaponGroup*) iter.value(); if (group->NumWeapons() > 1 && group->CanTarget(Ship::DROPSHIPS)) group->SetFiringOrders(Weapon::POINT_DEFENSE); else group->SetFiringOrders(Weapon::AUTO); group->SetTarget((Ship*) target, 0); } if (carrier_ai) carrier_ai->ExecFrame(secs); } }
bool FighterTacticalAI::IsStrikeComplete(Instruction* instr) { // wingmen can not call a halt to a strike: if (!ship || element_index > 1) return false; // if there's nothing to shoot at, we must be done: if (!instr || !instr->GetTarget() || instr->GetTarget()->Life() == 0 || instr->GetTarget()->Type() != SimObject::SIM_SHIP) return true; // break off strike only when ALL weapons are expended: // (remember to check all relevant wingmen) Element* element = ship->GetElement(); Ship* target = (Ship*) instr->GetTarget(); if (!element) return true; for (int i = 0; i < element->NumShips(); i++) { Ship* s = element->GetShip(i+1); if (!s || s->Integrity() < 25) // || (s->Location() - target->Location()).length() > 250e3) continue; ListIter<WeaponGroup> g_iter = s->Weapons(); while (++g_iter) { WeaponGroup* w = g_iter.value(); if (w->Ammo() && w->CanTarget(target->Class())) { ListIter<Weapon> w_iter = w->GetWeapons(); while (++w_iter) { Weapon* weapon = w_iter.value(); if (weapon->Status() > System::CRITICAL) return false; } } } } // still here? we must be done! return true; }
int FighterTacticalAI::ListSecondariesForTarget(Ship* tgt, List<WeaponGroup>& weps) { weps.clear(); if (tgt) { ListIter<WeaponGroup> iter = ship->Weapons(); while (++iter) { WeaponGroup* w = iter.value(); if (w->Ammo() && w->CanTarget(tgt->Class())) weps.append(w); } } return weps.size(); }
bool StarshipAI::AssessTargetPointDefense() { if (Game::GameTime() - point_defense_time < 3500) return tgt_point_defense; tgt_point_defense = false; if (!target || target->Type() != SimObject::SIM_SHIP || GetAILevel() < 2) return tgt_point_defense; Ship* tgt_ship = (Ship*) target; if (!tgt_ship->IsStarship()) return tgt_point_defense; Weapon* subtgt = 0; Point svec = ship->Location() - tgt_ship->Location(); point_defense_time = Game::GameTime(); // first pass: turrets ListIter<WeaponGroup> g_iter = tgt_ship->Weapons(); while (++g_iter && !tgt_point_defense) { WeaponGroup* g = g_iter.value(); if (g->CanTarget(1)) { ListIter<Weapon> w_iter = g->GetWeapons(); while (++w_iter && !tgt_point_defense) { Weapon* w = w_iter.value(); if (w->Availability() > 35 && w->GetAimVector() * svec > 0) tgt_point_defense = true; } } } return tgt_point_defense; }