示例#1
0
bool
TacticalAI::CheckObjectives()
{
    bool     processed = false;
    Ship*    ward      = 0;
    Element* elem      = ship->GetElement();

    if (elem) {
        Instruction* obj = elem->GetTargetObjective();

        if (obj) {
            ship_ai->ClearPatrol();

            if (obj->Action()) {
                switch (obj->Action()) {
                case Instruction::INTERCEPT:
                case Instruction::STRIKE:
                case Instruction::ASSAULT:
                    {
                        SimObject* tgt = obj->GetTarget();
                        if (tgt && tgt->Type() == SimObject::SIM_SHIP) {
                            roe = DIRECTED;
                            SelectTargetDirected((Ship*) tgt);
                        }
                    }
                    break;

                case Instruction::DEFEND:
                case Instruction::ESCORT:
                    {
                        SimObject* tgt = obj->GetTarget();
                        if (tgt && tgt->Type() == SimObject::SIM_SHIP) {
                            roe = DEFENSIVE;
                            ward = (Ship*) tgt;
                        }
                    }
                    break;

                default:
                    break;
                }
            }

            orders    = obj;
            processed = true;
        }
    }

    ship_ai->SetWard(ward);
    return processed;
}
Instruction*
Element::GetTargetObjective()
{
	for (int i = 0; i < objectives.size(); i++) {
		Instruction* obj = objectives[i];

		if (obj->Status() <= Instruction::ACTIVE) {
			switch (obj->Action()) {
			case Instruction::INTERCEPT:
			case Instruction::STRIKE:
			case Instruction::ASSAULT:
			case Instruction::SWEEP:
			case Instruction::PATROL:
			case Instruction::RECON:
			case Instruction::ESCORT:
			case Instruction::DEFEND:
				return obj;

			default:
				break;
			}
		}
	}

	return 0;
}
bool
Element::IsObjectiveTargetOf(const Ship* s) const
{
	if (!s || launch_time == 0 || IsFinished())
	return false;

	const char* e_name = Name().data();
	int         e_len  = Name().length();

	Instruction* orders = s->GetRadioOrders();
	if (orders && orders->Action() > Instruction::SWEEP) {
		const char* o_name = orders->TargetName();
		int         o_len  = 0;

		if (o_name && *o_name)
		o_len = strlen(o_name);

		if (e_len < o_len)
		o_len = e_len;

		if (!strncmp(e_name, o_name, o_len))
		return true;
	}

	Element* elem = s->GetElement();
	if (elem) {
		for (int i = 0; i < elem->NumObjectives(); i++) {
			Instruction* obj = elem->GetObjective(i);

			if (obj) {
				const char* o_name = obj->TargetName();
				int         o_len  = 0;

				if (o_name && *o_name)
				o_len = strlen(o_name);

				if (e_len < o_len)
				o_len = e_len;

				if (!strncmp(e_name, o_name, o_len))
				return true;
			}
		}
	}

	return false;
}
void
Element::ResumeAssignment()
{
	SetAssignment(0);

	if (objectives.isEmpty())
	return;

	Instruction* objective = 0;

	for (int i = 0; i < objectives.size() && !objective; i++) {
		Instruction* instr = objectives[i];

		if (instr->Status() <= Instruction::ACTIVE) {
			switch (instr->Action()) {
			case Instruction::INTERCEPT:
			case Instruction::STRIKE:
			case Instruction::ASSAULT:
				objective = instr;
				break;
			}
		}
	}

	if (objective) {
		Sim* sim = Sim::GetSim();

		ListIter<Element> iter = sim->GetElements();
		while (++iter) {
			Element*    elem = iter.value();
			SimObject*  tgt  = objective->GetTarget();

			if (tgt && tgt->Type() == SimObject::SIM_SHIP && elem->Contains((const Ship*) tgt)) {
				SetAssignment(elem);
				return;
			}
		}
	}
}
void
MsnElemDlg::Show()
{
	FormWindow::Show();

	if (!elem) return;

	int current_class = 0;

	if (cmb_class) {
		cmb_class->ClearItems();

		cmb_class->AddItem(Ship::ClassName(Ship::DRONE));
		cmb_class->AddItem(Ship::ClassName(Ship::FIGHTER));
		cmb_class->AddItem(Ship::ClassName(Ship::ATTACK));

		cmb_class->AddItem(Ship::ClassName(Ship::LCA));
		cmb_class->AddItem(Ship::ClassName(Ship::COURIER));
		cmb_class->AddItem(Ship::ClassName(Ship::CARGO));
		cmb_class->AddItem(Ship::ClassName(Ship::CORVETTE));
		cmb_class->AddItem(Ship::ClassName(Ship::FREIGHTER));
		cmb_class->AddItem(Ship::ClassName(Ship::FRIGATE));
		cmb_class->AddItem(Ship::ClassName(Ship::DESTROYER));
		cmb_class->AddItem(Ship::ClassName(Ship::CRUISER));
		cmb_class->AddItem(Ship::ClassName(Ship::BATTLESHIP));
		cmb_class->AddItem(Ship::ClassName(Ship::CARRIER));
		cmb_class->AddItem(Ship::ClassName(Ship::SWACS));
		cmb_class->AddItem(Ship::ClassName(Ship::DREADNAUGHT));
		cmb_class->AddItem(Ship::ClassName(Ship::STATION));
		cmb_class->AddItem(Ship::ClassName(Ship::FARCASTER));

		cmb_class->AddItem(Ship::ClassName(Ship::MINE));
		cmb_class->AddItem(Ship::ClassName(Ship::COMSAT));
		cmb_class->AddItem(Ship::ClassName(Ship::DEFSAT));

		cmb_class->AddItem(Ship::ClassName(Ship::BUILDING));
		cmb_class->AddItem(Ship::ClassName(Ship::FACTORY));
		cmb_class->AddItem(Ship::ClassName(Ship::SAM));
		cmb_class->AddItem(Ship::ClassName(Ship::EWR));
		cmb_class->AddItem(Ship::ClassName(Ship::C3I));
		cmb_class->AddItem(Ship::ClassName(Ship::STARBASE));

		const ShipDesign* design = elem->GetDesign();

		for (int i = 0; i < cmb_class->NumItems(); i++) {
			const char* cname   = cmb_class->GetItem(i);
			int         classid = Ship::ClassForName(cname);

			if (design && classid == design->type) {
				cmb_class->SetSelection(i);
				current_class = classid;
				break;
			}
		}
	}

	if (cmb_design) {
		OnClassSelect(0);
		OnDesignSelect(0);
	}

	if (cmb_role) {
		cmb_role->ClearItems();

		for (int i = Mission::PATROL; i <= Mission::OTHER; i++) {
			cmb_role->AddItem(Mission::RoleName(i));

			if (i == 0)
			cmb_role->SetSelection(0);

			else if (elem->MissionRole() == i)
			cmb_role->SetSelection(cmb_role->NumItems()-1);
		}
	}

	if (cmb_region) {
		cmb_region->ClearItems();

		if (mission) {
			StarSystem* sys = mission->GetStarSystem();
			if (sys) {
				List<OrbitalRegion> regions;
				regions.append(sys->AllRegions());
				regions.sort();

				ListIter<OrbitalRegion> iter = regions;
				while (++iter) {
					OrbitalRegion* region = iter.value();
					cmb_region->AddItem(region->Name());

					if (!strcmp(elem->Region(), region->Name()))
					cmb_region->SetSelection(cmb_region->NumItems()-1);
				}
			}
		}
	}

	char buf[64];

	if (edt_name)  edt_name->SetText(elem->Name());

	sprintf_s(buf, "%d", elem->Count());
	if (edt_size)  edt_size->SetText(buf);

	sprintf_s(buf, "%d", elem->GetIFF());
	if (edt_iff)   edt_iff->SetText(buf);

	sprintf_s(buf, "%d", (int) elem->Location().x / 1000);
	if (edt_loc_x) edt_loc_x->SetText(buf);

	sprintf_s(buf, "%d", (int) elem->Location().y / 1000);
	if (edt_loc_y) edt_loc_y->SetText(buf);

	sprintf_s(buf, "%d", (int) elem->Location().z / 1000);
	if (edt_loc_z) edt_loc_z->SetText(buf);

	sprintf_s(buf, "%d", elem->RespawnCount());
	if (edt_respawns) edt_respawns->SetText(buf);

	sprintf_s(buf, "%d", elem->HoldTime());
	if (edt_hold_time) edt_hold_time->SetText(buf);

	if (btn_player)      btn_player->SetButtonState(elem->Player() > 0 ? 1 : 0);
	if (btn_playable)    btn_playable->SetButtonState(elem->IsPlayable() ? 1 : 0);
	if (btn_alert)       btn_alert->SetButtonState(elem->IsAlert() ? 1 : 0);
	if (btn_command_ai)  btn_command_ai->SetButtonState(elem->CommandAI());

	UpdateTeamInfo();

	if (cmb_intel) {
		cmb_intel->ClearItems();

		for (int i = Intel::RESERVE; i < Intel::TRACKED; i++) {
			cmb_intel->AddItem(Intel::NameFromIntel(i));

			if (i == 0)
			cmb_intel->SetSelection(0);

			else if (elem->IntelLevel() == i)
			cmb_intel->SetSelection(cmb_intel->NumItems()-1);
		}
	}

	Instruction* instr = 0;
	if (elem->Objectives().size() > 0)
	instr = elem->Objectives().at(0);

	if (cmb_objective) {
		cmb_objective->ClearItems();
		cmb_objective->AddItem("");
		cmb_objective->SetSelection(0);

		for (int i = 0; i < Instruction::NUM_ACTIONS; i++) {
			cmb_objective->AddItem(Instruction::ActionName(i));

			if (instr && instr->Action() == i)
			cmb_objective->SetSelection(i+1);
		}
	}

	if (cmb_target) {
		OnObjectiveSelect(0);
	}

	if (cmb_heading) {
		double heading = elem->Heading();

		while (heading > 2*PI)
		heading -= 2*PI;

		while (heading < 0)
		heading += 2*PI;

		if (heading >= PI/4 && heading < 3*PI/4)
		cmb_heading->SetSelection(1);

		else if (heading >= 3*PI/4 && heading < 5*PI/4)
		cmb_heading->SetSelection(2);

		else if (heading >= 5*PI/4 && heading < 7*PI/4)
		cmb_heading->SetSelection(3);

		else
		cmb_heading->SetSelection(0);
	}

	exit_latch = true;
}