コード例 #1
0
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);
}
コード例 #2
0
ファイル: QuitView.cpp プロジェクト: Banbury/starshatter-open
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;
}
コード例 #3
0
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));
			}
		}
	}
}