/// <summary> /// Adds survival alert, what to do when this alert is triggered and trigger for this ocasion /// </summary> /// <param name="survivalAlert">trigger for survival decision</param> /// <param name="decision">decision for handeling survival</param> /// <param name="trigger">percentage of max parameter for health, oxygen and fuel issues | distance for detecting enemy</param> public void AddSurvivalAlert(MyBotSurvivalAlertsEnum survivalAlert, MyBotDecisionLogicsEnum decision, int trigger) { var survivalHandler = new MySurvivalDecision { SurvivalDecision = decision, SurvivalTrigger = trigger }; m_survivalKit.Add(survivalAlert, survivalHandler); }
/// <summary> /// Check one survival alert and decide if it is triggered /// </summary> /// <param name="alert"></param> /// <param name="check"></param> /// <returns></returns> private bool CheckSurvivalAlert(MyBotSurvivalAlertsEnum alert, MySurvivalDecision check) { switch (alert) { case MyBotSurvivalAlertsEnum.LowHealth: { //VOICE: DMG taking / LOW HP //TODO: merge //if (check.SurvivalTrigger * DEFAULT_HEALTH_MAX < this.Health) return true; return false; } case MyBotSurvivalAlertsEnum.LowOxygen: { //VOICE: LOW AIR/ EMPTY AIR return false; } case MyBotSurvivalAlertsEnum.LowFuel: { //VOICE: LOW FUEL / EMPTY FUEL return false; } case MyBotSurvivalAlertsEnum.UnderAttack: { if (Threat != null) { if (MyFactions.GetFactionsRelation(this.Faction, Threat.Faction) == MyFactionRelationEnum.Enemy || MyFactions.GetFactionsRelation(this.Faction, Threat.Faction) == MyFactionRelationEnum.Neutral) { Target = Threat; return true; } } return false; } case MyBotSurvivalAlertsEnum.EnemyInsight: { //handle this with under attack if (Threat != null && m_survivalKit.ContainsKey(MyBotSurvivalAlertsEnum.UnderAttack)) return false; //VOICE: DETECT PLAYER //Search for targets around //find new target if old target is hidden if (Target == null || !CheckCanSee(ref m_canSeeCheck, Target) ) { Target = SearchTargetToAttack(check.SurvivalTrigger); if (Target != null) { m_isInCombat = true; m_behaviourTimeCounter = Int16.MaxValue; return true; } else { Target = null; m_isInCombat = false; m_behaviourTimeCounter = Int16.MaxValue; } } else if (Target.IsDead()) { Target = null; m_isInCombat = false; m_behaviourTimeCounter = Int16.MaxValue; return true; } else if ( MyFactions.GetFactionsRelation(this.Faction, Target.Faction) == MyFactionRelationEnum.Enemy && (GetPosition() - Target.GetPosition()).Length() < MAX_ENEMY_IN_SIGHT) return true; return false; } case MyBotSurvivalAlertsEnum.CallForHelp: { return false; } case MyBotSurvivalAlertsEnum.Lost: { if (m_isLost) { return true; } return false; } default: { return false; } } }