void FighterTacticalAI::FindThreat() { // pick the closest contact on Threat Warning System: Ship* threat_ship = 0; Shot* threat_missile = 0; double threat_dist = 1e9; ListIter<Contact> c_iter = ship->ContactList(); while (++c_iter) { Contact* contact = c_iter.value(); if (contact->Threat(ship) && (Game::GameTime() - contact->AcquisitionTime()) > THREAT_REACTION_TIME) { double rng = contact->Range(ship); if (contact->GetShot()) { threat_missile = contact->GetShot(); } else if (rng < threat_dist && contact->GetShip()) { Ship* candidate = contact->GetShip(); if (candidate->InTransition()) continue; if (candidate->IsStarship() && rng < 50e3) { threat_ship = candidate; threat_dist = rng; } else if (candidate->IsDropship() && rng < 25e3) { threat_ship = candidate; threat_dist = rng; } // static and ground units: else if (rng < 30e3) { threat_ship = candidate; threat_dist = rng; } } } } ship_ai->SetThreat(threat_ship); ship_ai->SetThreatMissile(threat_missile); }
bool QuitView::CanAccept() { sim = Sim::GetSim(); if (!sim || sim->IsNetGame()) return true; Ship* player_ship = sim->GetPlayerShip(); if (player_ship->MissionClock() < 60000) { RadioView::Message(Game::GetText("QuitView.too-soon")); RadioView::Message(Game::GetText("QuitView.abort")); return false; } ListIter<Contact> iter = player_ship->ContactList(); while (++iter) { Contact* c = iter.value(); Ship* cship = c->GetShip(); int ciff = c->GetIFF(player_ship); if (c->Threat(player_ship)) { RadioView::Message(Game::GetText("QuitView.threats-present")); RadioView::Message(Game::GetText("QuitView.abort")); return false; } else if (cship && ciff > 0 && ciff != player_ship->GetIFF()) { Point delta = c->Location() - player_ship->Location(); double dist = delta.length(); if (cship->IsDropship() && dist < 50e3) { RadioView::Message(Game::GetText("QuitView.threats-present")); RadioView::Message(Game::GetText("QuitView.abort")); return false; } else if (cship->IsStarship() && dist < 100e3) { RadioView::Message(Game::GetText("QuitView.threats-present")); RadioView::Message(Game::GetText("QuitView.abort")); return false; } } } return true; }
void FltDlg::OnMissionType(AWEvent* event) { mission_type = -1; for (int i = 0; i < 6; i++) { if (mission_btn[i]) { if (mission_btn[i] == event->window) { mission_btn[i]->SetButtonState(1); mission_type = i; } else { mission_btn[i]->SetButtonState(0); } } } if (objective_list && mission_type > -1) { objective_list->ClearItems(); char txt[32]; Sim* sim = Sim::GetSim(); ListIter<Element> iter = sim->GetElements(); while (++iter) { Element* elem = iter.value(); if (!elem->IsActive() || elem->IsFinished() || elem->IsSquadron()) continue; CombatGroup* group = elem->GetCombatGroup(); int iff = elem->GetIFF(); Ship* s = elem->GetShip(1); double r = 0; bool con = false; if (iff != ship->GetIFF()) { if (elem->IntelLevel() < Intel::LOCATED) continue; if (group && group->IntelLevel() < Intel::LOCATED) continue; } if (s) { Point s_loc = s->Location() + s->GetRegion()->Location(); Point h_loc = ship->Location() + ship->GetRegion()->Location(); r = (s_loc - h_loc).length(); con = ship->FindContact(s) != 0; if (con) { FormatNumber(txt, r); } else { strcpy_s(txt, Game::GetText("FltDlg.Unknown").data()); r = 2e9; } } switch (mission_type) { case 1: // INTERCEPT if (iff && iff != ship->GetIFF() && s && s->IsDropship()) { int item = objective_list->AddItem(elem->Name()) - 1; objective_list->SetItemText(item, 1, s->GetRegion()->Name()); objective_list->SetItemText(item, 2, txt); objective_list->SetItemData(item, 2, (DWORD) r); } break; case 2: // ASSAULT if (iff && iff != ship->GetIFF() && s && (s->IsStarship() || s->IsStatic())) { int item = objective_list->AddItem(elem->Name()) - 1; objective_list->SetItemText(item, 1, s->GetRegion()->Name()); objective_list->SetItemText(item, 2, txt); objective_list->SetItemData(item, 2, (DWORD) r); } break; case 3: // STRIKE if (iff && iff != ship->GetIFF() && s && s->IsGroundUnit()) { int item = objective_list->AddItem(elem->Name()) - 1; objective_list->SetItemText(item, 1, s->GetRegion()->Name()); objective_list->SetItemText(item, 2, txt); objective_list->SetItemData(item, 2, (DWORD) r); } break; case 4: // ESCORT if ((iff == 0 || iff == ship->GetIFF()) && (!s || !s->IsStatic())) { int item = objective_list->AddItem(elem->Name()) - 1; if (s) { objective_list->SetItemText(item, 1, s->GetRegion()->Name()); objective_list->SetItemText(item, 2, txt); objective_list->SetItemData(item, 2, (DWORD) r); } else { objective_list->SetItemText(item, 1, "0"); objective_list->SetItemData(item, 1, 0); } } break; case 5: // SCOUT? break; default: break; } } } if (loadout_list && mission_type > -1) { loadout_list->ClearItems(); if (design) { ListIter<ShipLoad> sl = (List<ShipLoad>&) design->loadouts; while (++sl) { int item = loadout_list->AddItem(sl->name) - 1; char weight[32]; sprintf_s(weight, "%d kg", (int) ((design->mass + sl->mass) * 1000)); loadout_list->SetItemText(item, 1, weight); loadout_list->SetItemData(item, 1, (DWORD) (sl->mass * 1000)); } } } }