void FlatTriangleFanTree::FillReach(const AFlatGeoPoint &origin, const int index_low, const int index_high, ReachFanParms &parms) { const AGeoPoint ao(parms.task_proj.Unproject(origin), origin.altitude); height = origin.altitude; // fill vector if (depth) { const int index_mid = (index_high + index_low) / 2; const FlatGeoPoint x_mid = parms.reach_intercept(index_mid, ao); if (TooClose(x_mid, origin)) return; } assert(vs.empty()); vs.reserve(index_high - index_low + 1); AddPoint(origin); for (int index = index_low; index < index_high; ++index) { const FlatGeoPoint x = parms.reach_intercept(index, ao); /* hao: if reach_intercept() did not find anything reasonable it returns * a FlatGeoPoint that is almost the same as origin, but differs * +/- 1 due to conversion errors. The resulting polygon can have * overlapping edges causing triangulation failures. */ if (AlmostTheSame(origin, x)) AddPoint(origin); else AddPoint(x); } }
static bool IsEdge(const GLIX &HitGlix, const HitData &Hit, int i, int j) { if (i == j) return false; assert(i >= 0 && i < CandCount); assert(j >= 0 && j < CandCount); const HitData &Hit_i = Cands[i]; const HitData &Hit_j = Cands[j]; const int HitLength = GetHitLength(Hit); const int HitLength_i = GetHitLength(Hit_i); const int HitLength_j = GetHitLength(Hit_j); if (Ratio(HitLength, HitLength_i) < MIN_HIT_LENGTH_RATIO || Ratio(HitLength, HitLength_j) < MIN_HIT_LENGTH_RATIO || Ratio(HitLength_i, HitLength_j) < MIN_HIT_LENGTH_RATIO) return false; const int LINELength_i = GetLINELength(Hit_i); const int LINELength_j = GetLINELength(Hit_j); if (Ratio(LINELength_i, LINELength_j) < MIN_LINE_RATIO) return false; if (TooClose(HitGlix, Hit_i, Hit_j)) return false; return true; }
bool CParasite::ShouldAttack(CStateManager& mgr, float arg) { bool shouldAttack = false; if (x742_24_receivedTelegraph && x608_telegraphRemTime > 0.1f) shouldAttack = true; if (!TooClose(mgr, arg) && InMaxRange(mgr, arg)) return shouldAttack || InDetectionRange(mgr, 0.f); return false; }
bool CBloodFlower::ShouldAttack(CStateManager& mgr, float arg) { if (TooClose(mgr, 0.f)) return false; if (x584_curAttackTime <= x304_averageAttackTime) return false; return (mgr.GetPlayer().GetTranslation().z() + mgr.GetPlayer().GetEyeHeight() < x588_projectileOffset + x614_ + GetTranslation().z()); }
bool CBloodFlower::ShouldTurn(CStateManager& mgr, float) { if (TooClose(mgr, 0.f)) return false; zeus::CVector3f frontVec = GetTransform().basis[1]; frontVec.z() = 0.f; frontVec.normalize(); zeus::CVector3f posDiff = mgr.GetPlayer().GetTranslation() - GetTranslation(); posDiff.z() = 0.f; posDiff.normalize(); return posDiff.dot(frontVec) < 0.99599999f; }
void FlatTriangleFanTree::FillGaps(const AFlatGeoPoint &origin, ReachFanParms &parms) { // worth checking for gaps? if (vs.size() > 2 && parms.rpolars.IsTurningReachEnabled()) { // now check gaps const RoutePoint o(origin, RoughAltitude(0)); RouteLink e_last(RoutePoint(*vs.begin(), RoughAltitude(0)), o, parms.task_proj); for (auto x_last = vs.cbegin(), end = vs.cend(), x = x_last + 1; x != end; x_last = x++) { if (TooClose(*x, origin) || TooClose(*x_last, origin)) continue; const RouteLink e(RoutePoint(*x, RoughAltitude(0)), o, parms.task_proj); // check if children need to be added CheckGap(origin, e_last, e, parms); e_last = e; } } }
void CBloodFlower::PodAttack(CStateManager& mgr, EStateMsg msg, float arg) { if (msg == EStateMsg::Activate) { x450_bodyController->GetCommandMgr().DeliverCmd(CBCMeleeAttackCmd(pas::ESeverity::Zero)); x574_podEffect->SetParticleEmission(true); ActivateTriggers(mgr, true); } else if (msg == EStateMsg::Update) { if (TooClose(mgr, 0.f)) return; mgr.ApplyDamage(GetUniqueId(), mgr.GetPlayer().GetUniqueId(), GetUniqueId(), x5f8_podDamage, CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {}), {}); } else if (msg == EStateMsg::Deactivate) { x574_podEffect->SetParticleEmission(false); ActivateTriggers(mgr, false); x450_bodyController->GetCommandMgr().DeliverCmd(CBCKnockBackCmd({}, pas::ESeverity::One)); } }