void CameraDirector::SetViewObjectGroup(ListIter<Ship> group, bool quick) { if (!ship) return; Starshatter* stars = Starshatter::GetInstance(); if (!stars->InCutscene()) { // only view solid contacts: while (++group) { Ship* s = group.value(); if (s->GetIFF() != ship->GetIFF()) { Contact* c = ship->FindContact(s); if (!c || !c->ActLock()) return; } if (s->Life() == 0 || s->IsDying() || s->IsDead()) return; } } group.reset(); if (external_group.size() > 1 && external_group.size() == group.size()) { bool same = true; for (int i = 0; same && i < external_group.size(); i++) { if (external_group[i] != group.container()[i]) same = false; } if (same) { SetMode(MODE_ZOOM); return; } } ClearGroup(); if (quick) { mode = MODE_ORBIT; transition = 0; } else { SetMode(MODE_TRANSLATE); } external_group.append(group.container()); ListIter<Ship> iter = external_group; while (++iter) { Ship* s = iter.value(); region = s->GetRegion(); Observe(s); } }
bool Element::IsActive() const { bool active = false; for (int i = 0; i < ships.size() && !active; i++) { Ship* s = ships[i]; if (s->Life() && s->MissionClock()) active = true; } return active; }
bool Element::IsFinished() const { bool finished = false; if (launch_time > 0 && respawns < 1) { finished = true; if (ships.size() > 0) { for (int i = 0; i < ships.size() && finished; i++) { Ship* s = ships[i]; if (s->RespawnCount() > 0 || s->MissionClock() == 0 || s->Life() && !s->GetInbound()) finished = false; } } } return finished; }
bool MissionEvent::CheckTrigger() { Sim* sim = Sim::GetSim(); if (time > 0 && time > sim->MissionClock()) return false; switch (trigger) { case TRIGGER_TIME: { if (time <= sim->MissionClock()) Activate(); } break; case TRIGGER_DAMAGE: { Ship* ship = sim->FindShip(trigger_ship); if (ship) { double damage = 100.0 * (ship->Design()->integrity - ship->Integrity()) / (ship->Design()->integrity); if (damage >= trigger_param[0]) Activate(); } } break; case TRIGGER_DETECT: { Ship* ship = sim->FindShip(trigger_ship); Ship* tgt = sim->FindShip(trigger_target); if (ship && tgt) { if (ship->FindContact(tgt)) Activate(); } else { Skip(); } } break; case TRIGGER_RANGE: { Ship* ship = sim->FindShip(trigger_ship); Ship* tgt = sim->FindShip(trigger_target); if (ship && tgt) { double range = (ship->Location() - tgt->Location()).length(); double min_range = 0; double max_range = 1e12; if (trigger_param[0] > 0) min_range = trigger_param[0]; else max_range = -trigger_param[0]; if (range < min_range || range > max_range) Activate(); } else { Skip(); } } break; case TRIGGER_SHIPS_LEFT: { int alive = 0; int count = 0; int iff = -1; int nparams = NumTriggerParams(); if (nparams > 0) count = TriggerParam(0); if (nparams > 1) iff = TriggerParam(1); ListIter<SimRegion> iter = sim->GetRegions(); while (++iter) { SimRegion* rgn = iter.value(); ListIter<Ship> s_iter = rgn->Ships(); while (++s_iter) { Ship* ship = s_iter.value(); if (ship->Type() >= Ship::STATION) continue; if (ship->Life() == 0 && ship->RespawnCount() < 1) continue; if (iff < 0 || ship->GetIFF() == iff) alive++; } } if (alive <= count) Activate(); } break; case TRIGGER_EVENT_ALL: { bool all = true; int nparams = NumTriggerParams(); for (int i = 0; all && i < nparams; i++) { int trigger_id = TriggerParam(i); ListIter<MissionEvent> iter = sim->GetEvents(); while (++iter) { MissionEvent* e = iter.value(); if (e->EventID() == trigger_id) { if (e->Status() != COMPLETE) all = false; break; } else if (e->EventID() == -trigger_id) { if (e->Status() == COMPLETE) all = false; break; } } } if (all) Activate(); } break; case TRIGGER_EVENT_ANY: { bool any = false; int nparams = NumTriggerParams(); for (int i = 0; !any && i < nparams; i++) { int trigger_id = TriggerParam(i); ListIter<MissionEvent> iter = sim->GetEvents(); while (++iter) { MissionEvent* e = iter.value(); if (e->EventID() == trigger_id) { if (e->Status() == COMPLETE) any = true; break; } } } if (any) Activate(); } break; } return status == ACTIVE; }